perm filename GOMOVE.FAI[GO,ALS] blob sn#106804 filedate 1974-06-12 generic text, type T, neo UTF8
00100		TITLE	GOMOVE	5/15/70
00150	;	LAST EDITED BY GJA 7/2/72
00200	
00300		EXTERN	INFLTB,BOARDS,GBOARD,GB1,GB2,BLKARM,WHTARM,KOTAC,TTYGUY
00400		EXTERN	NDXFOR,GRPPTR,MSCVAL,WHDATA,BLDATA,IIIDPY,PNTDPY
00500		EXTERN	PFORCE,IFORCE,JFORCE,IFOR,JFOR,KFOR,BRDDPY,ZARMY
00600		EXTERN	KILSAV,KLLR,SAVR,STRSET,LIBEST,LIBVEC,NGHSTR,HDCPNT
00700		INTERN	LEGAL,XSTRPT,XSTKSR,XGB3,UNMOVE,STRPTR
00800		INTERN	DRIVER,GDRIVE,CONNDO,GB3,ENDANG,IIISET,KILLIV,LADRST
00900		INTERN	NOMOVE,UNTAC1,LEGAL1,LEGAL2,UNMOV1,TACEVL,LINE4,DRIVR1
01000		INTERN	EYDIAG,G1DIAG,EYENUM,NODANS,G1IKKN,TACSV1,EYCHEK
01100		INTERN	GB1TST,GODOWN,PIKPIL,GRUPNO,ELTNOS,GBDTST,TACSAV,ADLEND
01200		INTERN	AREA,AREAPT,XAREAP,KWAREA
01250		EXTERN PUTBWB
01260	
01265	
01270	OPDEF ERRUUO [5B8]
01275	DEFINE SAILERR & (NMBR,MESSAGE) <
01280		ERRUUO 1,[ASCIZ /GOMOVE ERROR NUMBER &NMBR& &MESSAGE/]>
01285	
01290	
01295	
01300	
01400	;*****SYMBOLIC REGISTERS USED OR AVAILABLE
01500		↓TAC←1
01600		↓TAC1←2
01700		↓TAC2←3
01800		↓TAC3←4
01900		↓TAC4←5
02000		↓TAC5←6
02100		↓FRIEND←7
02200		↓ENEMY←10
02300		↓STKREG←10
02400		↓BLANK←11
02500		↓BWREG←12
02600		↓SEARCH←13
02700		↓REPLCE←14
02800		↓CLEAR←15
02900		↓PDP←17
03000	
03100	;*****CONSTANT SYMBOLS OF LARGE IMPORT
03200		↓MXARNO←=50	;MAX NUMBER OF ARMIES (OR WALLS)
03300		BRDWTH←=21	;BOARD WIDTH, INCLUDING EDGES
03400		STRMAX←=127	;MAX NUMBER OF STRINGS
03500		STKMAX←=450	;SIZE OF STRING STACK FOR LOOKAHEAD
03600		WHTOCC←400000	;WHITE POINT OCCUPANCY
03700		WHTSHF←-=17	;SHIFTS WHTOCC TO RIGHT END OF WORD
03800		BLKOCC←200000	;BLACK POINT OCCUPANCY
03900		BNKOCC←100000	;BLANK POINT OCCUPANCY
04000		NONOCC←40000	;OFF-EDGE POINT
04100		STRCNT←1	;STRING COUNTER
04200		STRBTS←177	;MAXIMUM ALLOWABLE # OF STRINGS
04300		GRPCNT←200	;GROUP COUNTER
04400		GRPBTS←177	;MAXIMUM ALLOWABLE # OF GROUPS
04500		WHTNGH←1	;WHITE NEIGHBOR COUNTER
04600		BLKNGH←20	;BLACK NEIGHBOR COUNTER
04700		NGHBTS←17	;MAXIMUM ALLOWABLE # OF NEIGHBORS
04800		OCCBIT←10	;POINT OCCUPIED NEIGHBOR BIT
04900		AWSRRH←1	;STRING LIBERTY COUNTER
05000		AWSRRM←777	;MAXIMUM ALLOWABLE # OF STR LIBS
05100		AWSLRH←1000	;STRING STONE COUNTER
05200		AWSLRM←777	;MAX ALLOWABLE # OF STONES
05300		BCON←100000	;CONNECTED TO BLACK
05400		WCON←200000	;CONNECTED TO WHITE
05500		HBCON←40000	;HALF-CONNECTED TO BLACK
05600		HWCON←20000	;HALF-CONNECTED TO WHITE
05700		LRHSHF←-11	;FOR SHIFTING LRH TO RRH
05800		EYE←4000	;EYE MARK IN GBOARD
05900		DAME←2000	;DAME MARK IN GBOARD
06000		EYEVAL←3	;# HALFEYES AWARDED FOR A SURE EYE
06100		BKOUT←10000	;BEEN THERE BIT FOR RECURSIVE SEARCHES
06200		KEYBIT←4000	;"KEY" FLAG IN STRING DATA
06300		DEDBIT←2000	;"DEAD" FLAG IN STRING DATA
06400		DANBIT←1000	;"ENDANGERED" FLAG IN STRING DATA
06500		TACBIT←400000	;GBOARD "BAD AREA POINT" MARKER
06600	
06700	;**********
06800	;	GB3 HOLDS BITS REPRESENTING TACTICAL PROPERTIES OF THE POINT
06900	;IN QUESTION.  THE BITS 0-17 HOLD DATA WRT "ENEMY", WHILE BITS 18-35
07000	;HOLD DATA WRT "FRIENDLY".  NOTE THAT BOTH PARTS OF THE WORD CAN BE
07100	;USEFUL TO EITHER PLAYER'S EVALUATION.
07200		ENMGRD←1	;ON ENEMY GROUND
07300		ATARES←2	;ATARI ENEMY STONE(S)
07400		TWOLES←4	;TWOLIBERTY ENEMY STONE(S)
07500		SAVFRS←10	;SAVE FRIENDLY STONE(S)
07600		SECCON←20	;"SECURE" CONNECTION TO FRIENDLY GROUP
07700		NDNGST←40	;ENDANGER THE STONE JUST PLAYED
07800		TWOLFS←100	;TWOLIBERTY FRIENDLY STONE(S)
07900		ENMGRP←200	;ON ENEMY GROUP POINT
08000		EXPFGP←400	;EXPANDS FRIENDLY GROUP(S)
08100		FRDTIG←1000	;MAKES USEFUL TIGERMOUTH FOR FRIENDLY
08200		FRDEYE←2000	;MAKES AN EYE FOR FRIENDLY
08300		ENBLOK←4000	;BLOCKS ENEMY EXPANSION MOVE
08400		SPLENG←10000	;SPLITS AN ENEMY GROUP
08500		CMFRDG←20000	;COMBINES FRIENDLY GROUPS
08600		ENAREA←40000	;ON ENEMY AREA POINT
08700		EXPFRA←100000	;MAKES MORE FRIENDLY AREA
08800		GPNDNG←200000	;"NEAR ENDANGERED GROUP" MARKER
08900		BADHAF←400000	;MAKES WORST SORT OF FRIENDLY HALFCON
09000	;**********
09100	
09200	XGB3:	GB3			;ALSO POINTER FOR SAIL
09300		0
09400		BRDWTH*BRDWTH-1
09500		1
09600		XWD	1,BRDWTH*BRDWTH
09700	GB3:	BLOCK	BRDWTH*BRDWTH
09800	
09900	;*****TEMP STORAGE
10000	CAPTST:	BLOCK	5
10100	STRNUM:	BLOCK	5
10200	PIKPIL:	BLOCK	5
10300	GRUPNO:	BLOCK	5
10400		0		;HOLDS POTENTIAL DIAG MOVES COUNT
10500	EYENUM:	BLOCK	4
10600	WBSAV:	0
10700	TACSAV:	0
10800	TACSV1:	0
10900	NSTRNG:	0
11000	TACCPT:	0
11100	T5SAV:	0
11200	FORCMV:	0
11300	CHRACT:	0
11400	NFRND:	0
11500	NENEMY:	0
11600	NBLANK:	0
11700	NBLNKS:	0		;COUNTS # BLANK NGH IN NOMOVE
11800	R16SAV:	0
11900	PDPSAV:	0
12000	NODANS:	0
12100	DFLAG:	0		;HOLDS BEST "HOPELESS" GROUP SCORE
12200	
12300	;*****NEIGHBOR ADJUSTING ADD AND SUBTRACT
12400	BLKWHT:	WHTNGH		;WHT NEIGHBOR MARK
12500		BLKNGH		;BLK NEIGHBOR MARK
12600		-BLKNGH		;BLK NEIGH SUB
12700		-WHTNGH		;WHT NEIGH SUB
12800	FRNDON:	NGHBTS*WHTNGH		;WHITE NEIGHBOR COUNT BITS
12900		NGHBTS*BLKNGH		;BLACK NEIGHBOR COUNT BITS
13000		NGHBTS*WHTNGH
13100	
13200	;*****FRIEND-ENEMY DISCRIMINATION
13300	FRND:	XWD	WHTOCC,BLKOCC
13400		XWD	BLKOCC,WHTOCC
13500	WBHCON:	XWD	WCON,HWCON
13600		XWD	BCON,HBCON
13700	
13800	;**********
13900	;	STRING DESCRIPTION STORAGE.  THE "FIRST" JOB OF THE LEGAL
14000	;MOVE PROCESSOR IS TO MAKE A NEW OR AUGMENTED STRING CONTAINING THE
14100	;LATEST MOVE.  ALL ACTIVE STRINGS ARE IN STRPTR, SOME "OLDER" STRINGS
14200	;ARE SAVED IN STSTAK DURING LOOKAHEAD.  NOTE FOLLOWING CONVENTIONS:
14300	;1.  STRING #=0 MEANS NO STRING BECAUSE POINT IS BLANK
14400	;2.  STRING # =177 (OCTAL) MEANS POINT OFF EDGE (NEEDED FOR REPLACING)
14500	;**********
14600	
14700	;*****CURRENT STRING STORAGE
14800	XSTRPT:	STRPTR			;ALSO POINTER FOR SAIL
14900		0
15000		2*STRMAX+1
15100		1
15200		XWD	1,2*(STRMAX+1)
15300	STRPTR: 1
15400		BLOCK	2*STRMAX+1
15500	
15600	;*****RECORD OF OLD STRINGS FROM ONE OR MORE MOVES AGO
15700	XSTKSR: STKSRT			;POINTER FOR SAIL
15800		STSTAK
15900		-2
16000		STKMAX-1
16100		1
16200		XWD	1,STKMAX+2
16300	STKSRT: IOWD	STKMAX,STSTAK
16400	STKPTR: IOWD	STKMAX,STSTAK
16500	STSTAK: BLOCK	STKMAX
16600	
16700	;*****INDEX ADJUSTMENT FOR GETTING AROUND THE BOARD
16800	GODOWN:	XWD	TAC,-BRDWTH
16900		XWD	TAC,-1
17000	BACKUP:	XWD	TAC,BRDWTH
17100		XWD	TAC,1
17200		XWD	TAC,-BRDWTH
17300		XWD	TAC,-1
17400		XWD	TAC,BRDWTH		;EXTRAS NEEDED IN LADDER CHECKING
17500		XWD	TAC,1
17600		XWD	TAC,-BRDWTH
17700	
17800	;*****INDIRECT ADDR FOR GBORD1
17900		XWD	TAC,GB1
18000	GB1TST:	XWD	TAC,GB1-BRDWTH
18100		XWD	TAC,GB1-1
18200		XWD	TAC,GB1+BRDWTH
18300		XWD	TAC,GB1+1
18400		XWD	TAC,GB1-BRDWTH
18500		XWD	TAC,GB1-1
18600		XWD	TAC,GB1+BRDWTH
18700	
18800	;*****INDIRECT ADDRESS FOR GBOARD
18900		XWD	TAC,GBOARD
19000	GBDTST:	XWD	TAC,GBOARD-BRDWTH
19100		XWD	TAC,GBOARD-1
19200		XWD	TAC,GBOARD+BRDWTH
19300		XWD	TAC,GBOARD+1
19400		XWD	TAC,GBOARD-BRDWTH
19500		XWD	TAC,GBOARD-1
19600		XWD	TAC,GBOARD+BRDWTH
19700	
19800	;*****GBOARD DIAGONAL OFFSETS
19900	GBDIAG:	XWD	TAC,GBOARD-BRDWTH+1
20000		XWD	TAC,GBOARD-BRDWTH-1
20100		XWD	TAC,GBOARD+BRDWTH-1
20200		XWD	TAC,GBOARD+BRDWTH+1
20300		XWD	TAC,GBOARD-BRDWTH+1
20400	
20500	;*****GB1 SINGLE SKIPS
20600	G1IKKN:	XWD	TAC,GB1-2*BRDWTH
20700		XWD	TAC,GB1-2
20800		XWD	TAC,GB1+2*BRDWTH
20900		XWD	TAC,GB1+2
21000		XWD	TAC,GB1-2*BRDWTH
21100		XWD	TAC,GB1-2
21200	
21300	;*****GB1 DIAGONAL OFFSETS
21400	G1DIAG:	XWD	TAC,GB1-BRDWTH+1
21500		XWD	TAC,GB1-BRDWTH-1
21600		XWD	TAC,GB1+BRDWTH-1
21700		XWD	TAC,GB1+BRDWTH+1
21800		XWD	TAC,GB1-BRDWTH+1
21900		XWD	TAC,GB1-BRDWTH-1
22000		XWD	TAC,GB1+BRDWTH-1
22100	
22200	;*****INDIRECT ADDR FOR GB3
22300	GB3TST:	XWD	TAC,GB3-BRDWTH
22400		XWD	TAC,GB3-1
22500		XWD	TAC,GB3+BRDWTH
22600		XWD	TAC,GB3+1
22700	
22800	;*****GBOARD SINGLE SKIPS
22900	GBIKKN:	XWD	TAC,GBOARD-2*BRDWTH
23000		XWD	TAC,GBOARD-2
23100		XWD	TAC,GBOARD+2*BRDWTH
23200		XWD	TAC,GBOARD+2
     

00100	;**********
00200	;	THIS DRIVING SECTION WILL HANDLE ALL PRESENTLY CONTEMPLATED
00300	;RECURSIVE SEARCHES.  NOTE THAT ONLY GB1 CAN BE SEARCHED BY DRIVER.
00400	;TAC, SEARCH, CLEAR, AND REPLCE MUST BE SET EXTERNALLY.  POSSIBLE SEARCHES:
00500	;1.  BY ARMY NUMBER  (BITS 6-11 OF GB1)
00600	;2.  BY WALL NUMBER  (BITS 12-17 OF GB1)
00700	;3.  BY POINT OCCUPATION STATUS  (BITS 19-22 OF GB1)
00800	;4.  BY GROUP NUMBER  (BITS 23-28 OF GB1)
00900	;5.  BY STRING NUMBER  (BITS 29-35 OF GB1)
01000	;**********
01100	STRMAK:	MOVEM	CLEAR,ADLROU-1	       ;MAX POSSIBLE NUMBER OF LIBS TO FIND
01200		MOVEI	CLEAR,STRBTS*STRCNT
01300		SKIPA	TAC1,[PUSHJ PDP,ADLROU]	;SET DRIVER FOR STRING AMALGAMATION
01400	DRIVER:	MOVE	TAC1,[PUSHJ PDP,ADLEND+1];SET DRIVER FOR SIMPLE REPLACEMENT
01500		MOVEM	TAC1,DRIVR1-3
01600		JRST	0(TAC1)
01700		MOVEI	TAC1,3
01800		MOVE	TAC2,@GB1TST(TAC1)	;START LOOKING AT NEIGHBOR
01900		XOR	TAC2,SEARCH
02000		TDNE	TAC2,CLEAR		;SKIP MEANS A MATCH
02100		JRST	DRIVR1
02200		MOVEI	TAC,@GODOWN(TAC1)
02300		HRLM	TAC1,0(PDP)
02400		0				;RECURSIVE SEARCH STARTS HERE
02500		HLRZ	TAC1,0(PDP)
02600		MOVEI	TAC,@BACKUP(TAC1)
02700	DRIVR1:	SOJGE	TAC1,DRIVER+4
02800		POPJ	PDP,
02900	
03000	;**********
03100	;	GDRIVE IS ESSENTIALLY THE SAME AS DRIVER, EXCEPT THAT IT ALLOWS
03200	;THE STATE OF HALF-CONNECTEDNESS.  THIS MEANS TWO ENTITIES ARE CONSIDERED
03300	;CONNECTED WHEN THERE IS AT MOST ONE INTERVENING POINT NOT IN EITHER OF
03400	;THE TWO ENTITIES.  AT PRESENT, GROUPS ARE THE ONLY POSSIBLE "ENTITIES".
03500	;**********
03600	GDRIVE:	ANDCAM	CLEAR,GB1(TAC)
03700		ORM	REPLCE,GB1(TAC)
03800		MOVEI	TAC1,3
03900		MOVE	TAC2,@GB1TST(TAC1)
04000		AND	TAC2,CLEAR
04100		CAME	TAC2,SEARCH
04200		JRST	GDRIV2
04300		MOVEI	TAC,@GODOWN(TAC1)
04400		HRLM	TAC1,0(PDP)
04500		PUSHJ	PDP,GDRIVE
04600		HLRZ	TAC1,0(PDP)
04700		MOVEI	TAC,@BACKUP(TAC1)
04800	GDRIV1:	SOJGE	TAC1,GDRIVE+3
04900		POPJ	PDP,
05000	GDRIV2:	CAME	TAC2,CLEAR
05100		JRST	GDRIV1
05200		MOVEI	TAC,@GODOWN(TAC1)
05300		HRLM	TAC1,0(PDP)
05400		PUSHJ	PDP,CONNDO
05500		JRST	GDRIV1-2
05600	;*****TO STEP OVER ONE INTERVENING HALFCON
05700	CONNDO:	MOVEI	TAC1,3
05800		MOVE	TAC2,@GB1TST(TAC1)
05900		AND	TAC2,CLEAR
06000		CAME	TAC2,SEARCH
06100		JRST	CNNDO1
06200		MOVEI	TAC,@GODOWN(TAC1)
06300		HRLM	TAC1,0(PDP)
06400		PUSHJ	PDP,GDRIVE
06500		HLRZ	TAC1,0(PDP)
06600		MOVEI	TAC,@BACKUP(TAC1)
06700	CNNDO1:	SOJGE	TAC1,CONNDO+1
06800		POPJ	PDP,
06900	
07000	;**********
07100	;	THIS IS A SETUP ROUTINE FOR DRIVER WHEN STONES ARE CAPTURED
07200	;OR REPLACED DURING A MOVE/UNMOVE.  NOTE THAT TAC, CLEAR, AND SEARCH
07300	;(OR REPLCE) MUST BE SET BEFORE THE SETUP ROUTINE!
07400	;**********
07500	PICKUP:	SETZ	REPLCE,
07600		MOVE	TAC3,[AOS STRPTR(TAC2)]
07700		MOVE	TAC4,[PUSHJ PDP,NEIIN2+1]
07800		JRST	PIKPUT
07900	PUTDON:	SETZ	SEARCH,
08000		MOVE	TAC3,[SOS STRPTR(TAC2)]
08100		MOVE	TAC4,[PUSHJ PDP,NEIIN0+1]
08200	PIKPUT:	TLNN	TAC1,DEDBIT		;TAC1 MUST HOLD STRING DATA
08300		JRST	PIKPU1			;NOT DEAD REMOVAL SITUATION
08400		SETOM	NEIADJ-1		;SET FOR DEADNESS
08500		TRNE	TAC1,776000
08600		JRST	PIKPU1			;MORE THAN ONE DEAD MAN
08700		MOVE	TAC2,GBOARD(TAC)
08800		CAIE	ENEMY,BLKOCC
08900		TRCA	TAC2,7*WHTNGH
09000		TRC	TAC2,7*BLKNGH
09100		MOVEM	TAC2,GBOARD(TAC)	;RESTORE SPECIAL NGHBOR BITS
09200	PIKPU1:	MOVEM	TAC4,LBLOP2
09300		MOVEI	CLEAR,STRBTS*STRCNT
09400		MOVE	TAC2,[PUSHJ PDP,PIKROU]
09500		MOVEM	TAC2,DRIVR1-3		;SPECIAL HEAD FOR DRIVER
09600		MOVEM	TAC3,LBLOP1-1
09700		PUSHJ	PDP,PIKROU
09800		SETZM	NEIADJ-1		;SET FLAG NORMAL
09900		POPJ	PDP,
10000	
10100	;**********
10200	;	PIKROU PROCESSES THE "ENDS" OF THE AREA SEARCHED BY DRIVER
10300	;IN THE CASE WHERE WE WANT TO PICK UP OR REPLACE STRINGS.  IT FIXES
10400	;THE BOARD POSITION, THE INFLUENCE, AND THE STRING NAME.
10500	;**********
10600	
10700	PIKROU:	SETZM	PIKPIL
10800		MOVEI	TAC3,3
10900	LIBLOP:	TDNN	FRIEND,@GB1TST(TAC3)
11000		JRST	LBLOP1		;NOT ADJACENT FRIENDLY
11100		MOVE	TAC2,@GB1TST(TAC3)
11200		ANDI	TAC2,STRBTS*STRCNT
11300		MOVEI	TAC4,PIKPIL
11400		SKIPN	0(TAC4)
11500		JRST	.+4
11600		CAME	TAC2,0(TAC4)
11700		AOJA	TAC4,.-3
11800		JRST	LBLOP1		;DUPLICATION
11900		MOVEM	TAC2,0(TAC4)
12000		SETZM	1(TAC4)
12100		0			;SET BY PICKUP OR PUTDON
12200	LBLOP1:	SOJGE	TAC3,LIBLOP
12300		XORM	ENEMY,GB1(TAC)
12400		XORM	BLANK,GB1(TAC)
12500		SKIPGE	TAC5,FORCMV
12600	LBLOP2:	0			;SET BY PICKUP OR PUTDON
12700		SKIPN	IIIDPY
12710		JRST ADLEND+1
12720		PUSH PDP,TAC
12730		PUSH PDP,CHRACT
12800		PUSHJ	PDP,PUTBWB
12900		JRST	ADLEND+1
13000	
13100	;**********
13200	;	THIS ENDING OF PIKROU IS USED WHEN TACCLC WANTS TO FIND OUT HOW
13300	;CAPTURES HAVE AFFECTED THE ADJACENT FRIENDLY STRINGS.
13400	;**********
13500	
13600	LIBCHK:	AOS	STRPTR(TAC2)
13700		MOVE	TAC1,STRPTR(TAC2)
13800		ANDI	TAC1,AWSRRM*AWSRRH
13900		CAIGE	TAC1,3
14000		TRO	16,SAVFRS		;FRIEND SAVED
14100		SKIPGE	WBSAV
14200		JRST	LBLOP1			;WE ALREADY KNOW ABOUT COMBINING
14300		MOVE	TAC1,@GB1TST(TAC3)
14400		ANDI	TAC1,GRPBTS*GRPCNT
14500		SKIPN	WBSAV
14600		MOVEM	TAC1,WBSAV		;DEFINE WBSAV AS FIRST GROUP SEEN
14700		CAMN	TAC1,WBSAV
14800		JRST	LBLOP1			;HAVENT SEEN TWO GROUPS YET
14900		TRO	16,CMFRDG		;CONNECTS AT LEAST TWO FRIENDLIES
15000		MOVNM	TAC1,WBSAV		;DONT LOOK FOR COMBINING ANY MORE
15100		JRST	LBLOP1
15200	
15300	;**********
15400	;	THIS IS THE ROUTINE WHICH PROCESSES STRING ENDS WHEN AN
15500	;INFALLIBLE STRING EVALUATION IS DESIRED (USUALLY ONLY AT THE END OF
15600	;A PLY).  IT HANDLES ALL CASES OF DUPLICATED LIBS, ETC.
15700	;**********
15800		0			;HOLDS POSSIBLE # LIBERTIES TO FIND
15900	ADLROU:	MOVEI	TAC2,3
16000		TDNN	BLANK,@GB1TST(TAC2)
16100		JRST	ADLEND			;NOT A POSSIBLE LIBERTY
16200		MOVEI	TAC,@GODOWN(TAC2)
16300		MOVEI	TAC1,3
16400	CHKLOP:	MOVEI	TAC3,STRBTS*STRCNT
16500		AND	TAC3,@GB1TST(TAC1)
16600		CAME	TAC3,REPLCE		;IF TRUE, THEN LIB ALREADY COUNTED
16700		SOJGE	TAC1,CHKLOP
16800		MOVEI	TAC,@BACKUP(TAC2)
16900		JUMPGE	TAC1,ADLEND
17000		AOS	STRPTR(REPLCE)
17100		SOSLE	ADLROU-1		;FOUND ONE OF THE POSSIBLE LIBS
17200		JRST	ADLEND
17300		MOVEI	TAC3,ADLEND+1		;NO MORE LIBS CAN BE FOUND,
17400		HRRM	TAC3,DRIVR1-3		;SO DONT LOOK FOR ANY
17500	ADLEND:	SOJGE	TAC2,ADLROU+1
17600		ANDCAM	CLEAR,GB1(TAC)
17700		ORM	REPLCE,GB1(TAC)
17800		JRST	DRIVER+3
17900	
18000	;**********DEFINE IIIDPY THROUGH STATUS OF THE CURRENT TTY
18100	IIISET:	SETO	1,
18200		GETLIN	1
18300		POPJ	PDP,
18400	
21600	;**********
21700	;	FIND ALL GROUPS NEXT TO THE STRING NAMED IN SEARCH.  THESE GROUP
21800	;NAMES WILL BE PUT IN WHTARM.
21900	;**********
22000	CONNCT:	PUSHJ	PDP,STRSET+1
22100		MOVE	FRIEND,GB1(TAC)
22200		ANDI	FRIEND,BLKOCC+WHTOCC
22300		XORI	FRIEND,BLKOCC+WHTOCC	;FRIEND CONTAINS ATTACKING STONE
22400		MOVE	TAC1,[PUSHJ PDP,CNNCT1]
22500		MOVEM	TAC1,DRIVR1-3
22600		SETZM	WHTARM
22700		SETZM	WHTARM+1		;MAKES EASY TEST FOR KEYNESS
22800	CNNCT1:	MOVEI	TAC2,3
22900		LDB	TAC1,[POINT 8,@GB1TST(TAC2),28]
23000		CAIGE	TAC1,177
23100		JUMPN	TAC1,CNNCT3
23200		CAILE	TAC1,177
23300		JRST	CNNCT2		;OFF EDGE POINT
23400		MOVEI	TAC,@GODOWN(TAC2)
23500		MOVEI	TAC5,3
23600	CNNCT5:	LDB	TAC1,[POINT 8,@GB1TST(TAC5),28]
23700		JUMPE	TAC1,CNNCT4
23800		CAIL	TAC1,177
23900		JRST	CNNCT4
24000		HRRZ	TAC3,GRPPTR+MXARNO(TAC1)
24100		TDNE	FRIEND,GB1(TAC3)
24200		PUSHJ	PDP,GPPNT1
24300	CNNCT4:	SOJGE	TAC5,CNNCT5
24400		MOVEI	TAC,@GODOWN+2(TAC2)
24500		JRST	CNNCT2
24600	CNNCT3:	HRRZ	TAC3,GRPPTR+MXARNO(TAC1)
24700		TDNE	FRIEND,GB1(TAC3)
24800		PUSHJ	PDP,GPPNT1
24900	CNNCT2:	SOJGE	TAC2,CNNCT1+1
25000		JRST	ADLEND+1
25100	
25200	;**********
25300	;	THIS ROUTINE IS CRUCIAL TO MANAGEMENT OF DEAD STRINGS AND HENCE OF
25400	;GROUP CONNECTION.  (WE CONSIDER A DEAD STONE TO BE HALF-CONNECTED FOR THE
25500	;KILLING SIDE.)  THE HALF-CONNECTEDNESS IS SET AND UNSET BY LADRST.
25600	;**********
25700	LADRST:	MOVE	TAC,PFORCE
25800		LDB	SEARCH,[POINT 7,GB1(TAC),35]
25900		MOVE	TAC1,STRPTR(SEARCH)
26000		MOVE	TAC5,GBOARD(TAC)
26100		TLNN	TAC1,DEDBIT
26200		JRST	LADR01
26300	;*****NEWLY DEAD STRING?
26400		TRNN	TAC5,BCON
26500		JRST	WHTDED
26600		TRZ	TAC5,BCON+OCCBIT*BLKNGH
26700		TRCE	TAC5,7*BLKNGH
26800		JRST	LADR03
26900		JRST	LADONE		;ONLY ONE STONE
27000	WHTDED:	TRNN	TAC5,WCON
27100		POPJ	PDP,		;STRING WAS ALREADY SET DEAD
27200		TRZ	TAC5,WCON+OCCBIT*WHTNGH
27300		TRCN	TAC5,7*WHTNGH
27400		JRST	LADONE		;ONLY ONE STONE
27500		SKIPA	TAC5,[TRZ TAC3,OCCBIT*WHTNGH]
27600	LADR03:	MOVE	TAC5,[TRZ TAC3,OCCBIT*BLKNGH]
27700		JRST	LADR02+1
27800	;*****NEWLY UNDEAD STRING?
27900	LADR01:	TRNE	TAC5,BCON+WCON
28000		POPJ	PDP,		;STRING ALREADY IS SET UNDEAD
28100		MOVE	TAC4,GB1(TAC)
28200		TRNN	TAC4,BLKOCC
28300		JRST	UNWDED
28400		TRO	TAC5,BCON+OCCBIT*BLKNGH
28500		TRC	TAC5,7*BLKNGH
28600		TRNE	TAC5,7*BLKNGH
28700		JRST	LADR02
28800		TRZA	TAC5,HBCON+HWCON
28900	LADONE:	TRO	TAC5,HBCON+HWCON
29000		MOVEM	TAC5,GBOARD(TAC)
29100		POPJ	PDP,
29200	UNWDED:	TRO	TAC5,WCON+OCCBIT*WHTNGH
29300		TRC	TAC5,7*WHTNGH
29400		TRNN	TAC5,7*WHTNGH
29500		JRST	LADONE-1
29600		SKIPA	TAC5,[TRO TAC3,OCCBIT*WHTNGH]
29700	LADR02:	MOVE	TAC5,[TRO TAC3,OCCBIT*BLKNGH]
29800		MOVEM	TAC5,LADRS1+1
29900		SETZ	TAC5,
30000		PUSHJ	PDP,STRSET
30100		MOVE	TAC1,[PUSHJ PDP,LADRS1]
30200		MOVEM	TAC1,DRIVR1-3
30300	LADRS1:	HRRZ	TAC3,GBOARD(TAC)
30400		0			;SET BY LADRST PREPROCESSING
30500		SETZ	TAC4,
30600		PUSHJ	PDP,NEIADJ+2
30700		JRST	ADLEND+1
     

00100	;**********REMOVE INFLUENCE,NEIGHBORS DURING UNMOVE
00200	NEIIN2:	MOVE	TAC,TACSAV
00300		CAME	TAC5,[-2]		;DONT DO INFLUENCE DURING LADDERS
00400		PUSHJ	PDP,INFLSB(BWREG)
00500		MOVE	TAC5,BLKWHT+2(BWREG)
00600		JRST	NEIADJ
00700	;**********PUT DOWN INFLUENCE,NEIGHBORS
00800	NEIIN0:	MOVE	TAC,TACSAV
00900		CAME	TAC5,[-2]		;DONT DO INFLUENCE DURING LADDERS
01000		PUSHJ	PDP,INFLSB(BWREG)
01100		MOVE	TAC5,BLKWHT(BWREG)
01200		JRST	NEIADJ
01300	
01400	;**********
01500	;	ADJUST THE NEIGHBOR MARKS AND CARRY OUT THE CALCULATION FOR
01600	;CONNECTEDNESS.  THE MOVE POINT'S NEIGHBORS ALL GET TAC5 ADDED, WHILE THE
01700	;POINT ITSELF GETS OCCBIT*TAC5.  THE BCON, WCON, WBCON, HWCON BITS ARE SET.
01800	;**********
01900		0			;FLAG FOR SPECIAL DEAD STONE HANDLING
02000	NEIADJ:	MOVEI	TAC4,4
02100		HRRZ	TAC3,@GBDTST-1(TAC4)		;RIGHT HALF OF GBOARD
02200		TRZ	TAC3,BCON+WCON+HBCON+HWCON
02300		ADD	TAC3,TAC5			;ADJUST NEIGHBOR COUNT
02400		TRNN	TAC3,NGHBTS*BLKNGH		;ANY BLACK NEIGHBORS
02500		JRST	WHTCHK
02600		TRNN	TAC3,NGHBTS*WHTNGH		;ANY WHITE NEIGHBORS
02700		JRST	BLKCON
02800		TRNE	TAC3,OCCBIT*BLKNGH		;IS BLACK STONE HERE
02900		JRST	BLKCON
03000		TRNE	TAC3,OCCBIT*WHTNGH		;IS WHITE STONE HERE
03100		JRST	WHTCON
03200		TRNE	TAC3,BLKNGH*2			;BLACK HALF-CONNECTION
03300		ADDI	TAC3,HBCON
03400		TRNE	TAC3,WHTNGH*2			;WHITE HALF-CONNECTION
03500		ADDI	TAC3,HWCON
03600		JRST	ENDNGH
03700	WHTCHK:	TRNN	TAC3,NGHBTS*WHTNGH		;ANY WHITE NEIGHBORS
03800		JRST	ENDNGH
03900	WHTCON:	TROA	TAC3,WCON
04000	BLKCON:	TRO	TAC3,BCON
04100	ENDNGH:	HRRM	TAC3,@GBDTST-1(TAC4)
04200		SOJG	TAC4,NEIADJ+1
04300		JUMPE	TAC4,.+2
04400		POPJ	PDP,
04500		SKIPE	NEIADJ-1
04600		TDZA	TAC5,TAC5
04700		ASH	TAC5,3
04800		JRST	NEIADJ+1
04900	
05000	;*****OFFSETS FOR SETTING UP INFLUENCE ADJUSTMENT
05100	INFADJ:	XWD	TAC5,=14
05200		XWD	TAC5,=7
05300	GBDADJ:	XWD	TAC5,2*BRDWTH
05400		XWD	TAC5,BRDWTH
05500		XWD	TAC5,0
05600	JSTART:	2
05700		1
05800	ELTNOS:	4
05900		5
06000		REPEAT BRDWTH-6,{	6}
06100		5
06200		4
06300	
06400	;**********
06500	;	INFLSB WILL SUBTRACT INFLUENCE ABOUT THE MOVE POINT (AT TAC).  THE
06600	;ENTRY INFLSB+1 WILL ADD INFLUENCE.  NOTE THAT CARE IS TAKEN TO AVOID ANY
06700	;WRITING ON POINTS NOT IN THE ARRAY GBOARD.
06800	;**********
06900	INFLSB:	SKIPA	TAC4,[MOVN TAC1,@TAC2]	;SUBTRACT INFLUENCE
07000		MOVE	TAC4,[SKIPE TAC1,@TAC2]	;ADD INFLUENCE
07100		MOVEM	TAC4,ADDSUB
07200	;*****SET INDICIES USING THE (I,J) COORDINATES
07300		MOVE	TAC4,TAC
07400		IDIVI	TAC4,BRDWTH
07500		CAIG	TAC4,2			;TAC4 IS THE I-COORD
07600		SKIPA	TAC3,GBDADJ-1(TAC4)	;TAC3 WILL BE BOARD INDIR ADDR
07700		SKIPA	TAC3,GBDADJ+2
07800		SKIPA	TAC2,INFADJ-1(TAC4)	;TAC2 WILL BE INFLTB INDIR ADDR
07900		HRLZI	TAC2,TAC5		;MAKE TAC2 CONTROLLED BY TAC5
08000		ADDI	TAC3,GBOARD-3*BRDWTH-3(TAC)
08100		ADD	TAC2,INFLTB
08200		HRRZ	TAC4,ELTNOS-1(TAC4)	;TAC4 IS ROW COUNTER
08300		CAILE	TAC5,2			;TAC5 IS THE J-COORD
08400		JRST	.+3
08500		ADD	TAC3,JSTART-1(TAC5)
08600		ADD	TAC2,JSTART-1(TAC5)
08700		HRRZ	TAC5,ELTNOS-1(TAC5)	;TAC5 IS COLUMN COUNTER
08800		MOVEM	TAC5,T5SAV
08900	ADDSUB:	0				;SET FOR ADD OR SUB
09000		ADDM	TAC1,@TAC3
09100		SOJGE	TAC5,ADDSUB
09200		MOVE	TAC5,T5SAV
09300		ADDI	TAC3,BRDWTH
09400		ADDI	TAC2,7
09500		SOJGE	TAC4,ADDSUB
09600		POPJ	PDP,
09700	
09800	;**********CHECK FOR THE SIMPLE ILLEGAL MOVES
09900		SETZM	FORCMV
10000	STRT:	MOVE	TAC,-4(PDP)	;I-COORDINATE
10100		MOVE	TAC1,-3(PDP)	;J-COORDINATE
10200		MOVE	BWREG,-2(PDP)
10300		ANDI	BWREG,1
10400		AOS	BOARDS
10500		JUMPLE	TAC,BADMOV	;START OFF-BOARD CHECK
10600		JUMPLE	TAC1,BADMOV
10700		CAIL	TAC,BRDWTH-1
10800		JRST	BADMOV
10900		CAIL	TAC1,BRDWTH-1
11000		JRST	BADMOV
11100		IMULI	TAC,BRDWTH
11200		ADD	TAC,TAC1	;1-D BOARD COORDINATE IN TAC
11300		MOVEI	BLANK,BNKOCC
11400		TDNN	BLANK,GB1(TAC)
11500		JRST	DBLMOV		;POINT ALREADY OCCUPIED
11600		MOVEM	TAC,TACSAV	;SAVE MOVE COORDINATE
11700		HLRZ	FRIEND,FRND(BWREG)
11800		CAME	TAC,KOTAC
11900		POPJ	PDP,
12000		MOVEI	TAC1,3
12100		TDNE	FRIEND,@GB1TST(TAC1)
12200		POPJ	PDP,		;WE ARE FILLING KO
12300		SOJGE	TAC1,.-2
12400		JRST	BADKO		;ILLEGAL KO RETAKE
12500	
12600	;**********SET UP STRINGS IN THE LOCAL AREA
12700		SETOM	FORCMV
12800	STRNGS:	MOVE	STKREG,STKPTR	;REGISTER FOR STRING STACKING
12900		SETZM	STRNUM		;NAME STORAGE FOR EACH STRING
13000		SETZM	CAPTST		;CAPTURED STRING TAC STORAGE
13100		SETZM	TACCPT		;NUMBER OF MEN CAPTURED THIS TURN
13200		MOVEI	SEARCH,CAPTST	;ADDRESS OF CAP STRING STORAGE
13300		SETZ	REPLCE,		;BECOMES NAME OF CURRENT STRING
13400		HRL	TAC1,TAC
13500		HRRI	TAC1,AWSLRH
13600		MOVEM	TAC1,NSTRNG	;START OF DATA FOR CURRENT (FORMING) STRING
13700	;*****NEIGHBOR ANALYSIS (AND SETUP FOR MAKING A MOVE)
13800		SETZ	TAC1,		;HOLDS # MEN, # LIBS OF LARGEST SUBSTR
13900		MOVEI	TAC4,3
14000	P1LOP:	MOVEI	TAC2,STRBTS*STRCNT
14100		AND	TAC2,@GB1TST(TAC4)	;STRING NAME IN TAC2
14200		JUMPE	TAC2,P1LOP1-1	;STRING #=0 MEANS POINT IS VACANT
14300		CAIN	TAC2,STRBTS*STRCNT
14400		JRST	P1LOP1		;STRING #=177 MEANS POINT IS OFF EDGE
14500		MOVEI	TAC5,STRNUM	;DUPLICATION CHECK
14600		SKIPN	TAC3,0(TAC5)
14700		JRST	.+4
14800		CAME	TAC2,TAC3
14900		AOJA	TAC5,.-3
15000		JRST	DUPCAP		;DUPLICATION
15100		MOVEM	TAC2,0(TAC5)	;SAVE STRING NAME
15200		SETZM	1(TAC5)
15300		PUSH	STKREG,TAC2		;SAVE STRING NAME ON STACK
15400		PUSH	STKREG,STRPTR(TAC2)	;SAVE STRING DATA ON STACK
15500		TDNN	FRIEND,@GB1TST(TAC4)	;IS STRING FRIENDLY
15600		JRST	ENSTRG
15700		HRLZI	TAC3,777000
15800		AND	TAC3,STRPTR(TAC2)	;GET STRING STATUS BITS
15900		ORM	TAC3,NSTRNG
16000		HRRZ	TAC3,STRPTR(TAC2)	;ADD FRIENDLY DATA TO NSTRNG
16100		SUBI	TAC3,1			;BECAUSE OF NEW MAN AT TAC
16200		ADDM	TAC3,NSTRNG
16300		CAMG	TAC3,TAC1		;TEST FOR BIGGEST FRIENDLY SUBSTR
16400		JRST	P1LOP1
16500		MOVE	REPLCE,TAC2		;DEFINE NAME OF BIGGEST
16600		MOVE	TAC1,TAC3		;DEFINE SIZE OF BIGGEST
16700		JRST	P1LOP1
16800	DUPCAP:	LDB	TAC2,[POINT 9,STRPTR(TAC2),17]
16900		MOVEI	TAC5,CAPTST	;SHOULD ADD AN EXTRA LIB TO NSTRNG WHEN
17000		SKIPN	TAC3,0(TAC5)	;DUP IS OF A CAPTURED STRING
17100		JRST	P1LOP1
17200		CAME	TAC2,TAC3
17300		AOJA	TAC5,.-3
17400		JRST	P1LOP1-1
17500	ENSTRG:	LDB	TAC3,[POINT 27,STRPTR(TAC2),35]
17600		TRNE	TAC3,AWSRRH*(AWSRRM-1)
17700		JRST	P1LOP1
17800	ENCAPT:	HLRM	TAC3,0(SEARCH)	;SAVE TAC OF CAPTURED STRING FOR ERASING
17900		SETZM	1(SEARCH)
18000		AOJ	SEARCH,
18100		HRRZ	TAC3,TAC3
18200		LSH	TAC3,LRHSHF
18300		ADDM	TAC3,TACCPT	;# STONES CAPTURED
18400		AOS	NSTRNG		;BLANK OR CAPTURED ENEMY ADDS LIB TO NSTRNG
18500	P1LOP1:	SOJGE	TAC4,P1LOP
18600		MOVEI	TAC1,AWSRRH*AWSRRM
18700		AND	TAC1,NSTRNG
18800		JUMPE	TAC1,NOLBTY	;NO LIBS IN NSTRNG MEANS ILLEGAL MOVE
18900		SKIPGE	TAC5,FORCMV
19000		JRST	NEIIN0+1
19100		POPJ	PDP,
     

00100	;**********FIND FRIENDLY GROUP NAMES
00200	GPPINT:	JUMPE	TAC1,.+2		;NO GROUP
00300		CAIN	TAC1,GRPBTS
00400		POPJ	PDP,			;HAFCON
00500		HRRZ	TAC3,GRPPTR+MXARNO(TAC1)
00600		TDNN	FRIEND,GB1(TAC3)	;GROUP BASE POINT
00700		POPJ	PDP,			;ENEMY GROUP
00800		HRRZ	TAC3,GRPPTR(TAC1)
00900		TRNE	TAC3,777000
01000		JRST	GPPNT1
01100		SOS	EYENUM-1		;GROUP HAS NO (LIVING) STONES
01200		POPJ	PDP,
01300	GPPNT1:	MOVEI	TAC3,WHTARM
01400		SKIPN	TAC4,0(TAC3)
01500		JRST	.+4			;NO MORE NAMES
01600		CAME	TAC1,TAC4
01700		AOJA	TAC3,.-3
01800		POPJ	PDP,			;NAME ALREADY THERE
01900		MOVEM	TAC1,0(TAC3)		;RECORD NEW NAME
02000		SETZM	1(TAC3)
02100		POPJ	PDP,
02200	
02300	;**********
02400	;	FIND OUT IF POINT IS FRIENDLY OR ENEMY.  THE PARTICULAR
02500	;POINT IS DETERMINED BY THE VALUES OF TAC AND TAC2.  TAC1=0 MEANS
02600	;POINT IS FRIENDLY, TAC3=0 MEANS POINT IS BLANK.
02700	;**********
02800	ENFRGP:	LDB	TAC3,[POINT 7,@GB1TST(TAC2),28]
02900		JUMPE	TAC3,ENFRG2		;BLANK IS "FRIENDLY"
03000		CAIE	TAC3,GRPBTS
03100		JRST	ENFRG1
03200		HRRZ	TAC3,WBHCON(BWREG)
03300		TDNN	TAC3,@GBDTST(TAC2)
03400		POPJ	PDP,			;"ENEMY" HAFCON
03500		JRST	ENFRG2			;"FRIENDLY" HAFCON
03600	ENFRG1:	HRRZ	TAC1,GRPPTR+MXARNO(TAC3)
03700		TDNE	FRIEND,GB1(TAC1)
03800	ENFRG2:	SETZ	TAC1,
03900		POPJ	PDP,
04000	
04100	;**********
04200	;	TEST THE POINTS NEAR A PROPOSED "PATTERN A" SPLIT TO SEE IF
04300	;THE SPLIT SIDE WILL STILL BE CONNECTED AFTER THE SPLITTING MOVE.
04400	;"ENEMY" IS THE SIDE BEING SPLIT.
04500	;**********
04600	TESTIT:	TDNN	BLANK,0(TAC2)	;TAC2 HAS GB1 ADDRESS OF POINT
04700		JRST	TESTI3
04800		MOVE	TAC4,GBOARD-GB1(TAC2)
04900		CAIE	ENEMY,BLKOCC
05000		JRST	TESTI4
05100		TRNE	TAC4,NGHBTS*WHTNGH
05200		AOJA	TAC1,TESTI2+1
05300		ANDI	TAC4,NGHBTS*BLKNGH
05400		CAIGE	TAC4,3*BLKNGH
05500	TESTI2:	AOJ	TAC1,
05600		POPJ	PDP,
05700	TESTI4:	TRNE	TAC4,NGHBTS*BLKNGH
05800		AOJA	TAC1,TESTI2+1
05900		ANDI	TAC4,NGHBTS*WHTNGH
06000		CAIGE	TAC4,3*WHTNGH
06100		AOJ	TAC1,
06200		POPJ	PDP,
06300	TESTI3:	MOVE	TAC4,0(TAC2)
06400		TRNE	TAC4,NONOCC
06500		AOJA	TAC1,TESTI2
06600		ANDI	TAC4,177
06700		MOVE	TAC4,STRPTR(TAC4)
06800		TDNN	ENEMY,0(TAC2)
06900		JRST	TESTI1
07000		TLNE	TAC4,DEDBIT
07100		AOJA	TAC1,TESTI2
07200		POPJ	PDP,
07300	TESTI1:	TLNE	TAC4,DEDBIT
07400		SOJA	TAC1,TESTI2+1	;DEAD FRIENDLY, SO SPLIT UNLIKELY
07500		TRNE	TAC4,176
07600		AOJ	TAC1,		;FRIENDLY HAS >1 LIBERTY
07700		JRST	TESTI2
07800	
07900	;**********
08000	;	CHECK OUT POINT TAC TO SEE IF IT IS AN ATE POINT FOR FRIENDLY
08100	;(I.E., IF ENEMY PLAYS THERE HE ATARIS HIMSELF OR SUICIDES)
08200	;IF THE POINT IS AN ENEMY ATE POINT, THEN ADD 2 TO TAC2 (HOLDS
08300	;DIAGS TEST COUNT IN EYDIAG).  IF THE POINT IS AN ENEMY TWOLIB
08400	;POINT, THEN TURN ON THE LEFTHALF BITS OF TAC.
08500	;**********
08600	EYDIXX:	0		;THESE WORDS CAN BE SET EXTERNALLY
08700	EYDIX1:	0
08800	ATEPNT:	SETOM	EYDIXX
08900		MOVEM	TAC3,EYDIX1
09000		MOVEI	TAC1,3
09100	EYDIA4:	LDB	TAC3,[POINT 7,@GB1TST(TAC1),35]
09200		SKIPN	TAC3
09300		AOSA	EYDIXX		;COUNT ONE BLANK
09400		CAIL	TAC3,177
09500		JRST	EYDIA3
09600		LDB	TAC3,[POINT 9,STRPTR(TAC3),35]
09700		TDNN	FRIEND,@GB1TST(TAC1)
09800		JRST	.+4
09900		CAIG	TAC3,1
10000		AOS	EYDIXX		;FRIENDLY ATARIED NEIGHBOR
10100		JRST	EYDIA3
10200		ADDM	TAC3,EYDIXX
10300		SOS	EYDIXX		;ADD # ENEMY LIBS - 1
10400	EYDIA3:	SOJGE	TAC1,EYDIA4
10500		SKIPLE	TAC3,EYDIXX
10600		AOSA	EYENUM-1	;POTENTIAL DIAGONAL POINT
10700		ADDI	TAC2,2		;BONUS FOR EYDIAG, ETC.
10800		CAIG	TAC3,1
10900		HRRO	TAC,TAC		;MARK TWOLIB POINT
11000		EXCH	TAC3,EYDIX1
11100		POPJ	PDP,
11200	
11300	;**********
11400	;	TEST DIAGONAL OFFSETS OF TAC FOR POSSIBLE EYE CONFIGURATION.
11500	;IF TAC2≥5 THEN WE PASS.  COUNT 1 FOR OFF EDGE AND 2 FOR A POINT WHERE
11600	;THE OPPONENT CANT PLAY OR WOULD SELF-ATARI HIMSELF.
11700	;**********
11800	EYDIAG:	SETZ	TAC2,
11900		SETZM	EYENUM-1	;COUNTS POTENTIAL DIAGONAL MOVES
12000		MOVEI	TAC3,3
12100		SETZM	EYENUM(TAC3)		;ZERO EYE-MAKER ADDRESS HOLDER
12200		MOVE	TAC1,@G1DIAG(TAC3)
12300		TRNE	TAC1,NONOCC
12400		AOJA	TAC2,EYDIA1		;OFF EDGE
12500		TDNE	FRIEND,TAC1
12600		AOJA	TAC2,.-2		;FRIENDLY-OCCUPIED
12700		MOVEM	TAC2,EYENUM(TAC3)
12800		PUSH	PDP,TAC
12900		MOVEI	TAC,@G1DIAG(TAC3)
13000		SUBI	TAC,GB1		;GET DIAG OFFSET INTO TAC
13100		TRNE	TAC1,BNKOCC
13200		JRST	EYDIA		;TEST DIAG OFFSET FOR ENEMY SELF-ATE
13300		ANDI	TAC1,177
13400		MOVE	TAC1,STRPTR(TAC1)
13500		TRNE	TAC1,776
13600		JRST	EYDIA+2			;TOO MANY LIBERTIES
13700		MOVEI	TAC1,3		;GET BLANK NEXT TO ENEMY
13800		MOVE	TAC2,@GB1TST(TAC1)
13900		TRNN	TAC2,BNKOCC
14000		SOJGE	TAC1,.-2
14100		MOVE	TAC2,EYENUM(TAC3)
14200		JUMPL	TAC1,EYDIA+2
14300		MOVEI	TAC,@GODOWN(TAC1)	;USE THIS BLANK FOR ATEPNT
14400	EYDIA:	PUSHJ	PDP,ATEPNT
14500		CAME	TAC2,EYENUM(TAC3)
14600		SETZ	TAC,			;ATEPNT FOUND AN OK DIAG BLANK
14700		MOVEM	TAC,EYENUM(TAC3)
14800		POP	PDP,TAC
14900	EYDIA1:	SOJGE	TAC3,EYDIAG+3
15000		POPJ	PDP,
15100	
15200	;**********
15300	;	USE EYDIAG AND KNOWLEDGE THAT TACSV1 CONTAINS THE CURRENT MOVE
15400	;POINT TO SEE IF THE CURRENT MOVE MAKES AN EYE FOR ENEMY.  IF IT DOES,
15500	;RETURN TAC1 AS "FRDEYE".  IF IT THREATENS TO, RETURN TAC1 AS "FRDTIG".
15600	;**********
15700	EYCHEK:	TRCE	FRIEND,BLKOCC+WHTOCC
15800		TRNN	FRIEND,BLKOCC+WHTOCC
15900		SAILERR <1>		;FRIEND NOT BLACK OR WHITE 
15950							;**** ERROR MESSAGE 1 ****
16000		PUSHJ	PDP,EYDIAG
16100		XORI	FRIEND,BLKOCC+WHTOCC
16200		SKIPL	TACSV1
16300		JRST	EYCHK1-1
16400	;*****ANSWER FOR NOLBTY CASE (WHEN TRYING "ILLEGAL MOVE" FOR EYE)
16500		CAIL	TAC2,5
16600		JRST	EYCHK3		;WE HAVE AN EYE ALREADY
16700		CAIGE	TAC2,3
16800		JRST	EYCHK4		;WE CANT MAKE AN EYE IN ONE MORE MOVE
16900		JRST	EYCHK5		;CAN MAKE AN EYE IN ONE MORE MOVE
17000	;*****ANSWER FOR ALL OTHER CASES
17100		MOVEI	TAC1,3
17200	EYCHK1:	MOVE	TAC3,EYENUM(TAC1)
17300		CAMN	TAC3,TACSV1
17400		JRST	EYCHK2-2
17500		JUMPGE	TAC3,EYCHK2
17600		HRRZ	TAC3,TAC3
17700		SUB	TAC3,TACSV1
17800		MOVM	TAC3,TAC3
17900		CAIE	TAC3,BRDWTH
18000		SOJN	TAC3,EYCHK2
18100		SOS	EYENUM-1	;ONE LESS AVAILABLE BLANK
18200		ADDI	TAC2,2		;TWOLIB BECOMES SELF-ATE
18300	EYCHK2:	SOJGE	TAC1,EYCHK1
18400		CAIGE	TAC2,5
18500		JRST	.+3
18600	EYCHK3:	MOVEI	TAC1,FRDEYE	;AN EYE IS FORMED
18700		POPJ	PDP,
18800		MOVE	TAC3,EYENUM-1	;# AVAILABLE BLANKS AT DIAGS
18900		CAIE	TAC2,4
19000		JRST	.+4
19100		CAIL	TAC3,2
19200		JRST	EYCHK3
19300		JRST	EYCHK4+2	;SEE IF BLANKS HELP
19400		CAIL	TAC2,3
19500		JRST	.+3
19600	EYCHK4:	SETZ	TAC1,		;NOT THREAT FOR EYE
19700		POPJ	PDP,
19800		ADD	TAC3,TAC3
19900		ADD	TAC3,TAC2
20000		CAIGE	TAC3,5
20100		JRST	EYCHK4
20200	EYCHK5:	MOVEI	TAC1,FRDTIG	;THREAT TO MAKE EYE
20300		POPJ	PDP,
20400	
20500	;**********IF FORCMV>0 CHECK FOR OCCURRENCE OF ENEMY EYE
20600	NOLBTY:	SKIPG	FORCMV
20700		JRST	NOLBT1
20800		MOVE	TAC,TACSAV
20900		SETOM	TACSV1
21000		PUSHJ	PDP,EYCHEK		;CHECK EYE FOR NON-MOVER
21100		CAIE	TAC1,FRDEYE
21200		JRST	EYEMKR
21300	;*****RECORD NEW EYE AND ADD IT TO ITS GROUP
21400	EYMKR1:	MOVEI	TAC3,EYE		;DEFINE EYE MARK
21500		ORM	TAC3,GBOARD(TAC)	;MARK EYE
21600		MOVE	ENEMY,FRIEND
21700		XORI	ENEMY,BLKOCC+WHTOCC
21800		MOVEI	TAC2,3
21900		TDNN	ENEMY,@G1DIAG(TAC2)
22000		SOJA	TAC2,.-1
22100		LDB	TAC2,[POINT 7,@G1DIAG(TAC2),28]
22200		HRLZI	TAC3,EYEVAL		;ADD IN # HALFEYES
22300		JUMPE	TAC2,NOLBT1
22400		CAIGE	TAC2,177
22500		ADDM	TAC3,GRPPTR+2*MXARNO(TAC2)
22600		JRST	NOLBT1
22700	EYEMKR:	CAIE	TAC1,FRDTIG
22800		JRST	NOLBT1		;CANT MAKE EYE IN ONE MOVE
22900		MOVEI	TAC2,3
23000		TDNE	FRIEND,@GB1TST(TAC2)
23100		JRST	EYMKR1		;DEAD STRING IN ENEMY EYE
23200		SOJGE	TAC2,.-2
23300		MOVEI	TAC2,FRDEYE
23400		CAME	BWREG,TTYGUY
23500		MOVS	TAC2,TAC2	;TTYGUY EYE HERE
23600		MOVEI	TAC1,3
23700		SKIPE	TAC3,EYENUM(TAC1)
23800		ORM	TAC2,GB3(TAC3)	;MAKES EYE HERE
23900		SOJGE	TAC1,.-2
24000	;*****ERROR RETURNS
24100	NOLBT1:	SKIPA	1,[4]		;SUICIDE PLAY
24200	BADMOV:	MOVEI	1,1		;COORDINATES ARE OFF THE BOARD
24300		JRST	EXITPT+1
24400	BADKO:	SKIPA	1,[2]		;ILLEGAL KO RETAKE
24500	NOSTR:	MOVEI	1,5		;NO STRINGS LEFT
24600		JRST	EXITPT+1
24700	DBLMOV:	SKIPA	1,[3]		;POINT ALREADY OCCUPIED
24800	EXITPT:	SETZ	1,		;MOVE IS LEGAL
24900		POP	PDP,		;GET RID OF EXTRA PUSHJ
25000		SUB	PDP,[XWD 4,4]
25100		JRST	@4(PDP)
     

00100	;**********
00200	;	TACEVL GETS A TRANSLATION FROM BITS IN GB3 TO A VALUE FOR MOVE
00300	;PREDICTION.  IT CAN BE CALLED ANY TIME AFTER GB3 HAS BEEN SET FOR THE
00400	;CURRENT SITUATION.
00500	;**********
00600	TACEVL:	MOVE	TAC4,-1(PDP)	;ARRAY OF LINEAR COEFFICIENTS
00700		MOVE	TAC,-2(PDP)	;ADDRESS OF POINT IN QUESTION
00800		HRLI	TAC4,TAC2	;MAKE COEFF ADDR INDIRECT
00900		MOVEI	TAC2,=35	;THERE ARE 36 BITS IN A WORD
01000		MOVE	TAC3,-3(PDP)	;SIDE BEING LOOKED AT
01100		CAME	TAC3,TTYGUY
01200		SKIPA	TAC3,GB3(TAC)
01300		MOVS	TAC3,GB3(TAC)
01400		MOVEI	TAC5,1
01500		SETZ	TAC,
01600		TDNE	TAC3,TAC5
01700		ADD	TAC,@TAC4	;ADD BONUS IF ITS BIT IS ON
01800		LSH	TAC5,1
01900		SOJGE	TAC2,.-3
02000		JRST	EXITPT+2
02100	
02200		R0←0			;NAME FOR REGISTER 0
02300	;**********CALCULATE THE LINE 4 BIAS WEIGHT
02400	LINE4:	MOVE	R0,-3(PDP)	;I-COORD
02500		MOVE	TAC1,R0
02600		IMULI	TAC1,=21
02700		SUBI	R0,=10
02800		MOVM	R0,R0		;DISTANCE FROM CENTER
02900		MOVE	TAC,-2(PDP)	;J-COORD
03000		ADD	TAC1,TAC	;TAC1 HAS BOARD POSITION OFFSET
03100		MOVE	TAC2,GB3(TAC1)
03200		AOJN	TAC2,.+3	;IF GB3(TAC1)=-1, MOVE IS ILLEGAL
03300		MOVEI	TAC,400000
03400		JRST	EXITPT+2	;ILLEGAL MOVE RETURN
03500		SUBI	TAC,=10
03600		MOVM	TAC,TAC
03700		CAMG	R0,TAC
03800		EXCH	R0,TAC		;MAKE SURE R0≥TAC
03900		SUBI	R0,6		;GIVES DISTANCE FROM LINE 4
04000		CAIGE	R0,0
04100		MOVEI	R0,1		;SET TO 1 FOR HIGHER THAN LINE 4
04200		CAIE	R0,1
04300		LSH	R0,1		;MAGNIFY BY TWO IF NOT LINE 3 OR 5
04400		LSH	R0,2		;MAGNIFY SMALLER COORD BY FOUR
04500		SUBI	TAC,6
04600		CAIGE	TAC,0
04700		MOVM	TAC,TAC
04800		ADD	R0,TAC		;BOARD POSITION WEIGHTING FACTOR
04900		HLRE	TAC1,GBOARD(TAC1)	;INFLUENCE
05000		MOVM	TAC1,TAC1
05100		IDIVI	TAC1,3
05200		ADD	R0,TAC1		;POINT INFLUENCE WEIGHTING FACTOR
05300		MUL	R0,-1(PDP)	;WEIGHT
05400		JRST	EXITPT+2	;TAC HAS THE ANSWER NOW
05500	
05600	;**********
05700	;	SEE HOW LITTLE WORK MUST BE DONE TO UNDO A NOMOVE.  ONLY IN
05800	;CASE OF A CAPTURE DOES THE DATA HAVE TO BE RESTORED.
05900	;**********
06000	UNTAC1:	SKIPN	TAC2,CAPTST		;ANY CAPTURES TO UNDO
06100		POPJ	PDP,			;NO CAPTURES, SO NO WORK
06200		SETZM	FORCMV
06300		MOVE	TAC,TACSAV
06400		MOVE	BWREG,WBSAV
06500		MOVEI	TAC5,CAPTST+1		;NOMOVE SAVES BASE
06600		MOVE	SEARCH,STRPTR		;NAME IS SET BY TACCLC
06700		JUMPN	BWREG,.+4
06800		MOVEI	FRIEND,BLKOCC
06900		MOVEI	ENEMY,WHTOCC
07000		JRST	.+3
07100		MOVEI	FRIEND,WHTOCC
07200		MOVEI	ENEMY,BLKOCC
07300		MOVEI	BLANK,BNKOCC		;RESET FRIENDLY,ENEMY,BLANK
07400	RPLLOP:	MOVEI	REPLCE,STRMAX		;FIND OLD STRING NAME
07500		LDB	TAC,[POINT 9,STRPTR(REPLCE),17]
07600		CAME	TAC2,TAC
07700		SOJG	REPLCE,.-2
07800		HRLM	TAC5,0(PDP)
07900		MOVE	TAC1,STRPTR(REPLCE)	;STRING DATA FOR PUTDON
08000		PUSHJ	PDP,PUTDON+1		;PUT STRING BACK
08100		HLRZ	TAC5,0(PDP)
08200		SKIPE	TAC2,0(TAC5)		;ANY MORE CAPTURES
08300		AOJA	TAC5,RPLLOP
08400		POPJ	PDP,
08500	
08600	;**********
08700	;	LEGAL1 AND LEGAL2 ARE MOVE MAKERS DURING LADDERING.  WHAT IS KNOWN
08800	;IS THE TARGET STRING BASE POINT AND THE BOARD OFFSET OF THE POINT TO BE
08900	;PLAYED.  THESE MOVE MAKERS SET UP REGISTERS AND PDL FOR "LEGAL".
09000	;**********
09100	LEGAL1:	MOVE	BWREG,PFORCE		;STRING BASE POINT
09200		MOVEI	TAC1,BLKOCC
09300		TDNN	TAC1,GB1(BWREG)		;MOVE, STRING ARE ENEMIES
09400		JRST	.+5
09500		JRST	.+5
09600	LEGAL2:	MOVE	BWREG,PFORCE		;STRING BASE POINT
09700		MOVEI	TAC1,BLKOCC
09800		TDNE	TAC1,GB1(BWREG)		;MOVE, STRING ARE SAME SIDE
09900		SKIPA	BWREG,[1]
10000		SETZ	BWREG,
10100		MOVE	TAC,-1(PDP)
10200		IDIVI	TAC,BRDWTH
10300		MOVE	TAC2,0(PDP)		;FAKE PDL FOR 3 ARGS
10400		MOVEM	TAC2,2(PDP)
10500		ADD	PDP,[XWD 2,2]
10600		MOVNI	TAC2,2
10700		MOVEM	TAC2,FORCMV	;WANT NEIGHBORS BUT NOT INFLUENCE
10800		PUSHJ	PDP,STRT+4
10900		PUSHJ	PDP,STRNGS
11000		PUSHJ	PDP,MAKMOV
11100	
11200	;**********
11300	;	DECIDE EXTRA BONUS AWARDS IN GB3 FOR POINTS WHICH AFFECT LADDER
11400	;STATUS OF GIVEN GROUPS OF STONES.  THIS PROGRAM MUST BE RUN AFTER ENDANG
11500	;HAS BEEN CALLED TO SET THE ENDANGERED GROUPS DURING THE CURRENT UPDATE.
11600	;**********
11700	KILLIV:	MOVE	0,KILSAV	;ARRAY POINTER FROM SAIL
11800		MOVE	ENEMY,KLLR	;KILLER COUNTER
11900		ADD	ENEMY,0
12000		SOJ	ENEMY,
12100	KLLOOP:	CAMLE	0,ENEMY
12200		JRST	SVLOOP-2	;NO MORE KILLERS
12300		PUSHJ	PDP,KILSUB
12400		MOVE	TAC1,GB3(TAC)
12500		CAMN	TAC1,[-1]
12600		JRST	KLLOO1
12700		LSH	FRIEND,WHTSHF	;"FRIEND" IS SIDE ATTACKING STRING
12800		SKIPE	PIKPIL
12900		TLO	BLANK,GPNDNG	;NEAR ENDANGERED FRIENDLY
13000		SKIPE	WHTARM+1	;ARE THERE AT LEAST TWO FRIENDLIES
13100		TLO	BLANK,CMFRDG	;COMBINES FRIENDLY GROUPS
13200		LDB	TAC1,[POINT 9,STRPTR(SEARCH),35]
13300		SOJLE	TAC1,.+3
13400		CAILE	TAC2,3
13500		TLO	BLANK,FRDEYE	;MAKES FRIENDLY EYE
13600		TLO	BLANK,EXPFGP	;EXPANDS FRIENDLY GROUP
13700		HRLZI	TAC3,NDNGST	;ELIMINATE ANY FRIENDLY SELF-ATARI
13800		CAME	FRIEND,TTYGUY
13900		JRST	KLLOO2
14000		MOVS	BLANK,BLANK	;1-TTYGUY IS KILLING
14100		MOVS	TAC3,TAC3
14200		TLO	BLANK,SAVFRS	;SAVES ENEMY STONE
14300		LSH	TAC2,11
14400		ADDM	TAC2,GB2(TAC)	;# OF ENEMIES KILLED
14500	KLLOO2:	OR	BLANK,GB3(TAC)
14600		ANDCAM	TAC3,BLANK
14700		MOVE	TAC3,GB1(TAC)
14800		TLNE	TAC3,770000		;IF ON AREA POINT, THEN
14900		OR	BLANK,[XWD EXPFRA,EXPFRA]	;CAPTURE MAKES AREA
15000		MOVEM	BLANK,GB3(TAC)
15100	KLLOO1:	SOJA	ENEMY,KLLOOP
15200	;*****SAVER PROCESSING STARTS HERE
15300		ADD	ENEMY,SAVR	;SAVER OFFSET
15400		ADDI	0,=20		;SAVERS START AT KILSAV+=20
15500	SVLOOP:	CAMLE	0,ENEMY
15600		POPJ	PDP,
15700		PUSHJ	PDP,KILSUB
15800		MOVE	TAC1,GB3(TAC)
15900		CAMN	TAC1,[-1]
16000		JRST	SVLOO1
16100		TDZ	TAC1,[XWD NDNGST,NDNGST]	;ELIMINATE ANY SELF-ATARI
16200		MOVEM	TAC1,GB3(TAC)
16300		SKIPE	PIKPIL
16400		TRO	BLANK,GPNDNG	;NEAR ENDANGERED ENEMY
16500		SKIPE	WHTARM+1
16600		TRO	BLANK,CMFRDG	;CONNECTS FRIENDLY STONES
16700		MOVE	TAC3,STRPTR(SEARCH)
16800		TLNE	TAC3,KEYBIT
16900		TLO	BLANK,SPLENG	;SAVES KEY FRIENDLY STONES
17000		TRO	BLANK,EXPFGP	;EXPANDS ENEMY GROUP
17100		TLO	BLANK,SAVFRS	;SAVES FRIENDLY STONES
17200		LSH	FRIEND,WHTSHF	;"FRIEND" IS SIDE ATTACKING STONES
17300		CAMN	FRIEND,TTYGUY
17400		JRST	.+3
17500		MOVS	BLANK,BLANK	;1-TTYGUY IS SAVING
17600		ADDM	TAC2,GB2(TAC)	;# OF FRIENDLY STONES SAVED
17700		ORM	BLANK,GB3(TAC)
17800	SVLOO1:	SOJA	ENEMY,SVLOOP
17900	
18000	;*****BOOKKEEPING FOR KILLIV
18100	KILSUB:	SETZ	BLANK,		;HOLDS NEW AWARD BITS
18200		HLRZ	SEARCH,0(ENEMY)	;STRING #
18300		PUSHJ	PDP,CONNCT	;GET NEIGHBORING ENEMY GROUPS
18400		HLRZ	SEARCH,0(ENEMY)
18500		MOVE	TAC5,MSCVAL
18600		HRLZ	TAC5,=22(TAC5)	;"ENDANGERED GROUP" CUTOFF
18700		SETZM	PIKPIL
18800		MOVEI	TAC1,WHTARM
18900	KILSU1:	SKIPN	TAC2,0(TAC1)
19000		JRST	KILSU2
19100		SKIPL	TAC2		;SIGNAL THAT WE HAVE KEYNESS
19200		CAMLE	TAC5,GRPPTR+MXARNO(TAC2)
19300		SETOM	PIKPIL		;STRING STATUS AFFECTS ENDANGERED GROUP
19400		AOJA	TAC1,KILSU1
19500	KILSU2:	LDB	TAC2,[POINT 9,STRPTR(SEARCH),26]
19600		HRRZ	TAC,0(ENEMY)	;MOVE POINT WE ARE REWARDING
19700		MOVE	TAC3,TAC
19800		IDIVI	TAC3,BRDWTH
19900		CAIG	TAC3,BRDWTH-2
20000		CAIGE	TAC3,1
20100		SAILERR <2>		;******** ERROR MESSAGE 2 ********
20200		CAIG	TAC4,BRDWTH-2
20300		CAIGE	TAC4,1
20400		SAILERR <3>		;******** ERROR MESSAGE 3 ********
20500		POPJ	PDP,
     

00100	;**********
00200	;	CALCULATE SOME FAIRLY IMPORTANT TACTICAL QUANTITIES.  NOTE THAT
00300	;NO CHANGE IS MADE IN THE GAME DATA STRUCTURE, UNLESS ONE OR
00400	;MORE STONES GET CAPTURED.  SOME DATA GENERATED BY THE
00500	;LEGAL MOVE CHECKER IS USED BY TACCLC.
00600	;**********
00700	NOMOVE:	MOVEI	TAC1,1
00800		MOVEM	TAC1,FORCMV  ;SIGNAL TO CHECK FOR EYES IF MOVE IS A SUICIDE
00900		PUSHJ	PDP,STRT
01000		PUSHJ	PDP,STRNGS
01100		PUSH	PDP,		;TO GET THE EXTRA LEVEL OF STACK DEPTH
01200		MOVEM	16,R16SAV	;SAVE REGISTER 16 FOR SAIL
01300		SETZ	16,		;REG 16 WILL HOLD TACTICAL DATA MARKS
01400		MOVEI	ENEMY,WHTOCC+BLKOCC
01500		XOR	ENEMY,FRIEND	;SET UP TEST FOR ENEMY STONE
01600		MOVEM	TAC,TACSV1	;USED IN EYCHEK
01700		MOVEI	TAC4,STRNUM
01800	TACLOP:	SKIPN	SEARCH,0(TAC4)
01900		JRST	TACLP1
02000		LDB	TAC,[POINT 9,STRPTR(SEARCH),17]
02100		MOVE	TAC2,STRPTR(SEARCH)
02200		TLNN	TAC2,DEDBIT
02300		JRST	TACLO1
02400		TDNE	FRIEND,GB1(TAC)
02500		TROA	16,NDNGST	;MARK ADDITION TO DEAD STRING
02600		TLOA	16,NDNGST	;MARK CAPTURE OF DEAD STRING
02700		AOJA	TAC4,TACLOP
02800	TACLO1:	MOVEI	TAC1,AWSRRH*AWSRRM
02900		AND	TAC1,TAC2
03000		TDNN	FRIEND,GB1(TAC)
03100		JRST	ESTRG
03200		CAIL	TAC1,2
03300		AOJA	TAC4,TACLOP	;MORE THAN ONE LIBERTY
03400		TRO	16,SAVFRS	;FRIENDLY STONES UNATARIED
03500	;**********SEE IF ENEMY PLAY AT THIS POINT WILL MAKE AN EYE
03600		LDB	TAC2,[POINT 9,STRPTR(SEARCH),26]
03700		SOJG	TAC2,.+3
03800		PUSHJ	PDP,EYCHEK
03900		TLO	16,0(TAC1)
04000		AOJA	TAC4,TACLOP
04100	ESTRG:	SOJG	TAC1,ESTRG1
04200		HRLM	TAC4,0(PDP)	;CHECK CAPTURES FOR SAVING FRIENDLIES
04300		MOVE	REPLCE,STRPTR
04400		SETZM	WBSAV			;HOLDS GROUP NAMES FOR LIBCHK
04500		MOVE	TAC3,[JRST LIBCHK]
04600		MOVE	TAC1,STRPTR(SEARCH)	;STRING DATA FOR PICKUP
04700		PUSHJ	PDP,PICKUP+2
04800		HLRZ	TAC4,0(PDP)
04900		AOJA	TAC4,TACLOP
05000	ESTRG1:	CAILE	TAC1,2
05100		AOJA	TAC4,TACLOP
05200		SOJG	TAC1,.+2
05300		TROA	16,ATARES	;#STRINGS ATARIED
05400		TRO	16,TWOLES	;#STRINGS 2-LIBBED
05500		AOJA	TAC4,TACLOP
05600	TACLP1:	MOVE	TAC,TACSAV	;RESTORE BASE POINT
05700	;*****TRY FOR EYEMAKER AND USEFUL TIGERMOUTH LEADING TO EYEMAKER
05800		LDB	TAC5,[POINT 9,NSTRNG,35]	;# LIBERTIES
05900		CAILE	TAC5,2
06000		JRST	GROUPV			;MORE THAN TWO LIBERITES
06100		SOJG	TAC5,TACLP2
06200		SKIPN	TACCPT
06300		TRZ	16,SAVFRS	;IF NO CAPTURE, THEN NOONE IS SAVED
06400		TRO	16,NDNGST	;SELF-ATARI FOR FRIENDLY
06500		JRST	TACLP3
06600	TACLP2:	TRO	16,TWOLFS	;2-LIBBED FRIENDLY
06700		SKIPE	TACCPT		;DONT ALLOW ANY CAPTURES HERE
06800		JRST	GROUPV		;POINT NOT LIKELY EYE
06900	TACLP3:	MOVEI	TAC4,3
07000		TDNN	BLANK,@GB1TST(TAC4)
07100		JRST	GROUPV-1
07200		MOVEI	TAC3,@GODOWN(TAC4)
07300		MOVEM	TAC3,TACSV1	;SET UP TACSV1 FOR EYCHEK
07400		PUSHJ	PDP,EYCHEK
07500		JUMPE	TAC1,GROUPV-1
07600		JUMPE	TAC5,.+2
07700		MOVEI	TAC1,FRDTIG	;CANT MAKE EYE IF DONT CAPTURE
07800		CAME	BWREG,TTYGUY
07900		MOVS	TAC1,TAC1	;CREDIT GOES TO SIDE NOT MOVING
08000		MOVEI	TAC2,3
08100		TDNE	BLANK,@GB1TST(TAC2)
08200		ORM	TAC1,@GB3TST(TAC2)	;IF ONE POINT DESERVES REWARD,
08300		SOJGE	TAC2,.-2		;GIVE IT TO EVERYBODY
08400		JRST	GROUPV
08500		SOJGE	TAC4,TACLP3+1
08600	;**********ADJACENT POINT GROUP VALUE INSPECTION
08700	GROUPV:	SETZM	NFRND
08800		SETZM	NENEMY
08900		SETZM	NBLANK
09000		SETZM	NBLNKS		;HOLDS # BLANK NGH POINTS
09100		SETZM	WHTARM		;HOLDS NAMES OF FRIENDLY GROUPS
09200		SETZM	EYENUM-1	;≠0 IF EXPANDS DEAD FRIENDLY GROUP
09300		SETZM	EYENUM		;HOLDS SPLIT TEST ADDRESS
09400		SETZM	EYENUM+1	;≠0 MEANS FOUND OFF-EDGE POINT
09500		SETZM	EYENUM+2	;COUNTS # SECURE CONNECTIONS
09600		SETOM	EYENUM+3	;COUNTS BAD HALFCONS MADE BY MOVE
09700		SETZ	TAC2,
09800		PUSHJ	PDP,ENFRGP	;FIND OUT IF LAST SIDE IS BAD
09900		JUMPE	TAC1,.+3
10000		MOVEM	TAC3,GRUPNO+4	;ENEMY GROUP NAME (OR HAFCON)
10100		JRST	.+2
10200		MOVNM	TAC3,GRUPNO+4	;FRIENDLY GROUP NAME (OR ZERO)
10300		MOVEI	TAC2,3
10400	GROUPS:	LDB	TAC1,[POINT 7,@GB1TST(TAC2),28]
10500		JUMPE	TAC1,GROPS1
10600		CAIE	TAC1,GRPBTS
10700		JRST	GRUPEF		;POINT IS IN A GROUP
10800		SKIPA	TAC3,[JRST NOTBNK]	;SET FOR HAFCON
10900	GROPS1:	MOVE	TAC3,[SETZ TAC1,]	;SET FOR NOTCON
11000		MOVEM	TAC3,GROPS3
11100		TDNE	BLANK,@GB1TST(TAC2)
11200		JRST	GROPS2
11300		SETZ	TAC1,
11400		MOVE	TAC3,@GB1TST(TAC2)
11500		TRNN	TAC3,BLKOCC+WHTOCC
11600		SETOM	EYENUM+1	;OFF-EDGE POINT
11700		JRST	GROUPB
11800	GROPS2:	MOVE	TAC3,@GBDTST(TAC2)
11900		TRNN	TAC3,377
12000		AOS	NBLNKS		;NON-DAME BLANK NEIGHBOR
12100	;*****GET GROUP CONNECTIONS
12200		LDB	TAC1,[POINT 7,@G1DIAG(TAC2),28]
12300		PUSHJ	PDP,GPPINT
12400		LDB	TAC1,[POINT 7,@G1IKKN(TAC2),28]
12500		PUSHJ	PDP,GPPINT
12600		SKIPN	GRUPNO+1(TAC2)
12700		JRST	.+3
12800		LDB	TAC1,[POINT 7,@G1DIAG+1(TAC2),28]
12900		PUSHJ	PDP,GPPINT
13000	;*****CAN THERE BE HALFCONS
13100	GROPS3:	0			;*****SET AT GROPS1 FOR NOCON OR HAFCON
13200		MOVE	TAC5,@GBDTST(TAC2)
13300		TRNE	TAC5,(BLKNGH+WHTNGH)*NGHBTS
13400		JRST	.+3
13500		AOS	NBLANK		;NO NEIGHBORS, NO HALFCON POSSIBLE
13600		JRST	GROUPB
13700	;*****CHECK FOR HALFCON CREATION
13800		SETZ	TAC4,		;DETECTS NEARBY DEAD FRIENDLY
13900		TDNE	FRIEND,@G1IKKN(TAC2)
14000		JRST	GRUPS1
14100	GRUPS3:	HRLZI	TAC3,DEDBIT
14200		TDNN	FRIEND,@G1DIAG(TAC2)
14300		JRST	GRUPS2
14400		LDB	TAC5,[POINT 7,@G1DIAG(TAC2),35]
14500		TDNE	TAC3,STRPTR(TAC5)
14600		SOJA	TAC4,GRUPS2
14700		TDNN	ENEMY,@GB1TST+3(TAC2)
14800		JRST	GRUPS2
14900		LDB	TAC5,[POINT 7,@GB1TST+3(TAC2),35]
15000		TDNN	TAC3,STRPTR(TAC5)
15100		JRST	GOTHAF		;CROSS-CUT POTENTIAL HALFCON
15200	GRUPS2:	TDNN	FRIEND,@G1DIAG+1(TAC2)
15300		JRST	GRUPS4
15400		LDB	TAC5,[POINT 7,@G1DIAG+1(TAC2),35]
15500		TDNE	TAC3,STRPTR(TAC5)
15600		SOJA	TAC4,GRUPS4
15700		TDNN	ENEMY,@GB1TST+1(TAC2)
15800		JRST	GRUPS4
15900		LDB	TAC5,[POINT 7,@GB1TST+1(TAC2),35]
16000		TDNN	TAC3,STRPTR(TAC5)
16100		JRST	GOTHAF		;CROSS-CUT POTENTIAL HALFCON
16200	GRUPS4:	JUMPL	TAC4,GROUPB	;EXPANDED DEAD STRING
16300		JRST	GROUPF		;EXPANDED NON-DEAD STRING
16400	GRUPS1:	LDB	TAC5,[POINT 7,@G1IKKN(TAC2),35]
16500		MOVE	TAC5,STRPTR(TAC5)
16600		TLNE	TAC5,DEDBIT
16700		SOJA	TAC4,GRUPS3		;CANT HALFCONNECT TO DEAD STONE
16800		ANDI	TAC5,177
16900		CAIG	TAC5,2
17000		JRST	GOTHAF		;MOVE CAN BE SPLIT FROM IKKEN FRIENDLY
17100		MOVE	TAC3,TAC
17200		IDIVI	TAC3,BRDWTH
17300		SUBI	TAC3,BRDWTH/2
17400		MOVM	TAC3,TAC3
17500		CAIE	TAC3,BRDWTH/2-2
17600		JRST	.+4
17700		CAIE	TAC2,3
17800		CAIN	TAC2,1
17900		JRST	GROUPF		;LINE 2, NO HALFCON
18000		SUBI	TAC4,BRDWTH/2
18100		MOVM	TAC4,TAC4
18200		CAIE	TAC4,BRDWTH/2-2
18300		JRST	.+4
18400		CAIE	TAC2,2
18500		CAIN	TAC2,0
18600		JRST	GROUPF		;LINE 2, NO HALFCON
18700	;*****SEE IF POINTS LOCALLY CONNECTED ALREADY
18800		MOVEI	TAC,@GODOWN(TAC2)
18900		PUSH	PDP,TAC2
19000		EXCH	FRIEND,ENEMY
19100		SETO	TAC5,
19200		MOVEI	TAC3,1(TAC2)
19300	GRUPS5:	SETO	TAC1,		;COUNTS ENEMY UNCONTROLLED POINTS
19400		MOVEI	TAC2,@G1DIAG(TAC3)
19500		PUSHJ	PDP,TESTIT
19600		MOVEI	TAC2,@G1DIAG+1(TAC3)
19700		PUSHJ	PDP,TESTIT
19800		MOVEI	TAC2,@GB1TST(TAC3)
19900		PUSHJ	PDP,TESTIT
20000		JUMPLE	TAC1,GRUPS6	;THIS MOVE IS NOT A SPLIT
20100		TRC	TAC3,2
20200		AOJE	TAC5,GRUPS5	;TRY OTHER SIDE
20300	GRUPS6:	POP	PDP,TAC2
20400		EXCH	FRIEND,ENEMY
20500		MOVEI	TAC,@GODOWN+2(TAC2)
20600		JUMPLE	TAC1,GROUPF	;THIS IS AN OK CONNECTION
20700	GOTHAF:	AOS	EYENUM+3	;MOVE CREATES HALFCON
20800		JRST	GROUPF
20900	;*******LOOK AT HALFCON POINT
21000	NOTBNK:	HRRZ	TAC1,WBHCON(BWREG)
21100		TDNN	TAC1,@GBDTST(TAC2)
21200		JRST	GROUPE		;ENEMY HALFCON POINT
21300		TDNE	ENEMY,@G1IKKN(TAC2)
21400		JRST	NOTBN1
21500		MOVEI	TAC4,3(TAC2)
21600		TDNN	FRIEND,@G1DIAG(TAC2)
21700		SUBI	TAC4,2
21800		HRRZ	TAC5,@GBDTST(TAC4)
21900		CAIE	BWREG,0
22000		LSH	TAC5,-4
22100		ANDI	TAC5,17
22200		CAILE	TAC5,1
22300		JRST	GROUPF		;DOES NOT MAKE HALFCON
22400		HRRZ	TAC3,GODOWN(TAC4)
22500		ADDI	TAC3,@GBIKKN(TAC2)
22600		HRRZ	TAC5,0(TAC3)
22700		CAIE	BWREG,0
22800		LSH	TAC5,-4
22900		ANDI	TAC5,17
23000		CAIG	TAC5,2
23100	NOTBN1:	AOS	EYENUM+3	;MOVE CREATES HALFCON
23200		JRST	GROUPF
23300	GRUPEF:	HRRZ	TAC3,GRPPTR(TAC1)
23400		TDNE	BLANK,@GB1TST(TAC2)
23500		AOS	NBLNKS
23600		TRNE	TAC3,777000
23700		JRST	GRPEF1
23800	;*****NO (LIVING) STONES IN THIS GROUP
23900		HRRZ	TAC3,GRPPTR+MXARNO(TAC1)
24000		JUMPE	TAC3,.+3
24100		TDNE	FRIEND,GB1(TAC3)
24200		SOS	EYENUM-1	;DEAD FRIENDLY GROUP EXPANDER
24300		SETZ	TAC1,		;THIS STRING IS DEAD
24400		JRST	GROUPE+1
24500	GRPEF1:	HRRZ	TAC3,GRPPTR+MXARNO(TAC1)
24600		TDNN	FRIEND,GB1(TAC3)
24700		JRST	GROUPC
24800		MOVE	TAC5,@GBDTST(TAC2)
24900		TRNE	TAC5,(NGHBTS-1)*(BLKNGH+WHTNGH)
25000		JRST	GRUPF1
25100		TDNN	FRIEND,@G1IKKN(TAC2)
25200		JRST	.+3
25300		LDB	TAC5,[POINT 7,@G1IKKN(TAC2),35]
25400		JRST	GRUPE1
25500		TDNN	FRIEND,@G1DIAG(TAC2)
25600		JRST	GRUPE2
25700		TDNN	ENEMY,@GB1TST+3(TAC2)
25800		JRST	GRUPF1+1	;DIAGONAL CONNECTION
25900		LDB	TAC5,[POINT 7,@G1DIAG(TAC2),35]
26000		JRST	GRUPE1
26100	GRUPE2:	TDNN	ENEMY,@GB1TST+1(TAC2)
26200		JRST	GRUPF1+1	;DIAGONAL CONNECTION
26300		LDB	TAC5,[POINT 7,@G1DIAG+1(TAC2),35]
26400	GRUPE1:	LDB	TAC5,[POINT 9,STRPTR(TAC5),35]
26500		CAIN	TAC5,1
26600		JRST	GRUPF2
26700		CAIE	TAC5,2
26800		JRST	GRUPF1+2
26900		TRNE	16,ATARES
27000		TRNE	16,NDNGST
27100	GRUPF2:	AOS	EYENUM+3	;MOVE CREATES HALFCON
27200		JRST	GROUPF-1
27300	GRUPF1:	TLO	16,ENMGRP	;NEXT TO FRIENDLY STONE
27400		SETOM	EYENUM+1
27500		AOS	EYENUM+2	;FRIENDLY SECURE CONNECTION
27600		PUSHJ	PDP,GPPINT
27700	GROUPF:	AOS	TAC5,NFRND
27800		CAIN	TAC5,1
27900		TDNE	FRIEND,@GB1TST(TAC2)	;IS POINT OCCUPIED
28000		TRZA	TAC5,777777
28100		MOVEI	TAC5,@GODOWN(TAC2)	;SAVE BLANK GROUP POINT ADDRESS
28200		MOVEM	TAC5,EYENUM		;≠0 IF ONE BLANK GROUP NEIGH
28300	GROUPB:	MOVNM	TAC1,GRUPNO(TAC2)
28400		JRST	GROUPL
28500	GROUPC:	TDNE	ENEMY,GB1(TAC3)
28600		JRST	.+3
28700		SETZM	GRUPNO(TAC2)		;NOT A "REAL" GROUP
28800		JRST	GROUPL
28900		LDB	TAC3,[POINT 7,@GB1TST(TAC2),35]
29000		CAMN	TAC3,STRPTR
29100		JRST	GROUPC+2	;THIS STRING GETS CAPTURED
29200	GROUPE:	AOS	NENEMY
29300		MOVEM	TAC1,GRUPNO(TAC2)
29400	GROUPL:	SOJGE	TAC2,GROUPS
29500		SKIPE	NBLNKS
29600		JRST	.+3
29700		MOVEI	TAC2,DAME	;THIS POINT HAS NO BLANK NEIGHBORS
29800		ORM	TAC2,GBOARD(TAC);AND IS LIKELY TO BE DAME
29900	;**********EXPANDED FRIENDLIES, CONNECTION
30000		SKIPN	EYENUM+3
30100		TRO	16,BADHAF	;MOVE CREATES EXACTLY ONE BAD HALFCON
30200		SKIPG	TAC2,NFRND	;# NEIGHBORS NEXT TO FRIENDLY
30300		JRST	NOSEC
30400		SOJG	TAC2,.+4
30500		TRNN	16,BADHAF
30600		TRO	16,SECCON
30700		JRST	NOSEC
30800		TRNE	16,BADHAF
30900		SOJ	TAC2,
31000		TRO	16,SECCON
31100		CAIGE	TAC2,2
31200		JRST	NOSEC
31300		MOVE	TAC2,EYENUM+2
31400		CAILE	TAC2,2
31500		TLO	16,ENMGRP	;NEXT TO ≥3 GROUP POINTS
31600	;*****SEE IF THIS MOVE LEAVES AN OBVIOUS CUT BEHIND
31700	NOSEC:	SETO	TAC4,
31800		TRNN	16,ATARES+TWOLES
31900		SKIPE	TACCPT
32000		JRST	TRYSPL+1	;MOVE CAPTURES OR ATARIS SOMETHING
32100		EXCH	TAC,EYENUM	;GET BLANK NEIGHBOR GROUP POINT
32200		JUMPE	TAC,TRYSPL
32300		PUSHJ	PDP,LIBEST
32400		HRRZ	TAC1,LIBVEC+1
32500		CAILE	TAC1,2
32600		JRST	TRYSP2
32700		TRZ	16,BADHAF	;ENEMY "SPLIT" WILL BE SELF-ATARI
32800		TRO	16,SECCON
32900		SETO	TAC4,
33000		JRST	TRYSPL
33100	;*****SEE IF PROSPECTIVE CUT WILL BE OVERWHELMED
33200	TRYSP2:	MOVEI	TAC1,3
33300		HLRZ	TAC3,WBHCON(BWREG)
33400		TDNE	TAC3,@GBDTST(TAC1)
33500		AOJG	TAC4,TRYSPL
33600		SOJGE	TAC1,.-2
33700	;**********ON FRIENDLY OR ENEMY GROUP POINT
33800	TRYSPL:	EXCH	TAC,EYENUM
33900		MOVE	TAC5,FRNDON+1(BWREG)
34000		TDNN	TAC5,GBOARD(TAC)
34100		JRST	TRYSP1		;NOT ON ENEMY LIBERTY
34200		TRO	16,ENMGRP		;ON ENEMY GROUP POINT
34300		TLNN	16,NDNGST		;DONT CONNECT TO DEAD STONE
34400		TLO	16,SECCON		;SECURELY CONNECTED TO ENEMY
34500		SKIPL	TAC4
34600		TRO	16,BADHAF	;MOVE CAN BE CUT OFF DIRECTLY
34700	TRYSP1:	HRLZI	TAC1,AWSLRH
34800		SETZ	TAC3,
34900		SETZ	TAC2,		;HOLDS CONNECTED GROUP NAMES
35000	NOXPN1:	SKIPN	TAC4,WHTARM(TAC3)
35100		JRST	NOXPN2
35200		ADDM	TAC1,GRPPTR+MXARNO(TAC4)	;ANOTHER GROUP EXTEND POINT
35300		LSH	TAC2,6
35400		OR	TAC2,TAC4	;SAVE GROUP NAME
35500		AOJA	TAC3,NOXPN1
35600	NOXPN2:	JUMPE	TAC3,NOXPND
35700		TLNE	TAC2,777777
35800		MOVEI	TAC2,777777	;CONNECTS MORE THAN THREE GROUPS
35900		CAMN	BWREG,TTYGUY
36000		MOVS	TAC2,TAC2	;FRIENDLY NAMES IN BITS 18-35
36100		ORM	TAC2,GB2(TAC)	;SAVE CONNECTED NAMES FOR ENDANG
36200		SKIPG	EYENUM+3	;≥2 BAD HAFCONS?
36300		CAIGE	TAC3,2
36400		JRST	NOXPN3		;DOES NOT CONNECT GROUPS
36500		TRNE	16,SECCON	;AT LEAST 1 SIDE MUST BE CONNECTED SOLIDLY
36600		TRO	16,CMFRDG	;CONNECTS AT LEAST TWO FRIENDLIES
36700		MOVEI	TAC3,WHTARM
36800		SKIPN	TAC4,0(TAC3)
36900		JRST	NOXPN3
37000		AOS	GRPPTR+2*MXARNO(TAC4)
37100		AOJA	TAC3,.-3
37200	NOXPN3:	SKIPE	NBLANK		;TRUE IF NOTHING IS ADDED TO THE GROUP
37300		JRST	NOXPND-1
37400		LDB	TAC1,[POINT 7,GB1(TAC),28]
37500		JUMPN	TAC1,.+5
37600		MOVE	TAC1,GBOARD(TAC)
37700		TRNN	TAC1,NGHBTS*(BLKNGH+WHTNGH)
37800		JRST	NOXPND-1	;NON-GROUP POINT SURROUNDED BY GROUP POINTS
37900		JRST	NOXPND		;USELESS POINT BETWEEN TWO WALLS
38000		CAIL	TAC1,GRPBTS
38100		JRST	NOXPND-1	;PLAYING ON HALFCON EXPANDS A GROUP
38200		HRRZ	TAC1,GRPPTR+MXARNO(TAC1)
38300		TDNE	ENEMY,GB1(TAC1)		;IS POINT IN ENEMY GROUP
38400		TRO	16,EXPFGP	;EXPANDS FRIENDLY GROUP
38500	NOXPND:	MOVE	TAC1,NENEMY
38600		SKIPN	TACCPT
38700		TRNE	16,SAVFRS
38800		JRST	.+4
38900		CAIGE	TAC1,4
39000		TRNE	16,NDNGST	;SELF-ATARI POINT?
39100		JRST	XIT
39200		SUBI	TAC1,2
39300		JUMPL	TAC1,XIT
39400	;**********PATTERN "B" ("DOUBLE CUT") SPLIT
39500		TDNN	TAC5,GBOARD(TAC)
39600		JRST	ASPLIT-1
39700		MOVEI	TAC2,3
39800	BSPLIT:	SKIPLE	TAC1,GRUPNO(TAC2)
39900		SKIPG	TAC3,GRUPNO+1(TAC2)
40000		JRST	BSPLT1		;NOT ENEMY
40100		CAME	TAC1,TAC3
40200		TDNE	TAC1,WBHCON(BWREG)
40300		JRST	SPLTB1		;SAME ENEMY OR HAFCON
40400		TDNN	TAC3,WBHCON(BWREG)
40500		JRST	BSPLT1		;TAC1,TAC3 ARE DIFFERENT ENEMIES
40600	SPLTB1:	TDNN	FRIEND,@G1DIAG+1(TAC2)
40700		JRST	BSPLT1
40800		MOVE	TAC1,@G1DIAG+1(TAC2)
40900		ANDI	TAC1,177
41000		MOVE	TAC1,STRPTR(TAC1)
41100		TLNN	TAC1,DEDBIT	;DEAD "SPLITTER"?
41200		TRNN	TAC1,176	;1-LIB "SPLITTER"?
41300		JRST	BSPLT1
41400		LDB	TAC1,[POINT 7,@G1DIAG+1(TAC2),28]
41500		CAIN	TAC1,GRPBTS
41600		JRST	SPLITA
41700		CAME	BWREG,TTYGUY
41800		SKIPA	TAC3,GB2(TAC)
41900		MOVS	TAC3,GB2(TAC)
42000		LSH	TAC3,6
42100		OR	TAC3,TAC1	;ADD NAME OF OTHER SPLITTING GROUP
42200		CAME	BWREG,TTYGUY
42300		HRRM	TAC3,GB2(TAC)
42400		CAMN	BWREG,TTYGUY
42500		HRLM	TAC3,GB2(TAC)
42600	SPLITA:	TDO	16,[XWD CMFRDG,SPLENG]		;MOVE SPLITS ENEMY GROUPS
42700		JRST	XIT
42800	BSPLT1:	SOJGE	TAC2,BSPLIT
42900	;**********PATTERN "A" (OPPOSING ENEMIES) SPLIT
43000		MOVEI	TAC2,1
43100	ASPLIT:	SKIPLE	TAC3,GRUPNO(TAC2)
43200		SKIPG	GRUPNO+2(TAC2)
43300		SOJGE	TAC2,ASPLIT
43400		JUMPL	TAC2,XIT
43500		SETO	TAC5,
43600		MOVEI	TAC3,1(TAC2)
43700	ASPLT1:	SETO	TAC1,		;COUNTS ENEMY UNCONTROLLED POINTS
43800		MOVEI	TAC2,@G1DIAG(TAC3)
43900		PUSHJ	PDP,TESTIT
44000		MOVEI	TAC2,@G1DIAG+1(TAC3)
44100		PUSHJ	PDP,TESTIT
44200		MOVEI	TAC2,@GB1TST(TAC3)
44300		PUSHJ	PDP,TESTIT
44400		CAME	BWREG,TTYGUY
44500		SKIPA	TAC2,GB2(TAC)
44600		MOVS	TAC2,GB2(TAC)
44700		TRNN	TAC2,777777	;EXPANDS FRIENDLY GROUP?
44800		SUB	TAC1,NENEMY	;POTENTIAL SPLIT MAY BE OVERWHELMED
44900		JUMPLE	TAC1,XIT	;THIS MOVE IS NOT A SPLIT
45000		TRC	TAC3,2
45100		AOJE	TAC5,ASPLT1	;TRY OTHER SIDE
45200		JUMPG	TAC1,SPLITA	;THIS IS A REAL SPLIT
45300	;*****TIGERMOUTH AWARDS, IF ANY
45400	XIT:	TRNE	16,TWOLFS	;DOES CURRENT MOVE HAVE TWO LIBERTIES
45500		TRNE	16,ATARES	;ATARIS ENEMY STRING?
45600		JRST	XIT1
45700		TRNE	16,SPLENG	;DOES CURMOVE SPLIT ENEMY GROUPS
45800		SKIPE	TACCPT		;DOES CURMOVE CAPTURE ANYTHING
45900		JRST	XIT1
46000		SETZM	PIKPIL+4	;NONZERO IF FOUND NON-PROTECTING TIGERMOUTH
46100		CAIE	BWREG,0
46200		SKIPA	TAC1,[WCON]
46300		MOVEI	TAC1,BCON
46400		MOVEI	TAC3,BCON+WCON
46500		MOVEI	TAC2,3
46600	XIT3:	TDNN	BLANK,@GB1TST(TAC2)
46700		JRST	XIT2
46800		MOVEI	TAC,@GODOWN(TAC2)
46900		MOVEI	TAC4,3
47000		MOVEI	TAC5,3		;COUNTS NUMBER OF ADJACENT GROUP POINTS
47100		TDNE	TAC1,@GBDTST(TAC4)
47200		SOJA	TAC5,.+3		;FOUND SPLIT SIDE GROUP POINT
47300		TDNE	TAC3,@GBDTST(TAC4)
47400		AOJ	TAC5,			;FOUND SPLITTING SIDE GROUP POINT
47500		SOJGE	TAC4,.-4
47600		SKIPG	TAC5			;<3 SPLIT SIDE GROUP POINTS
47700		SETOM	PIKPIL+4		;FOUND NON-USEFUL TIGERMOUTH
47800		MOVEI	TAC,@BACKUP(TAC2)
47900	XIT2:	SOJGE	TAC2,XIT3
48000		SKIPN	PIKPIL+4
48100		JRST	.+3
48200		TDZ	16,[XWD CMFRDG,SPLENG]
48300		JRST	XIT1
48400		MOVE	TAC1,BRDDPY
48500		SKIPE	0(TAC1)
48600		AOJA	TAC1,.-1
48700		CAME	BWREG,TTYGUY
48800		HRLM	TAC1,0(TAC1)	;FRIENDLY SPLITTING POINT
48900		HRRM	TAC,0(TAC1)	;SPLITTING POINT ADDRESS
49000		SETZM	1(TAC1)		;NEW END MARKER
49100	;*****SEE IF MOVE THREATENS TO SAVE DEAD STONES
49200	XIT1:	TRNE	16,SECCON
49300		TRNE	16,BADHAF
49400		JRST	XIT4
49500		TRNE	16,NDNGST
49600		JRST	XIT4
49700		SKIPGE	EYENUM-1
49800		TRO	16,SAVFRS	;THREATENS RESCUE
49900	XIT4:	CAMN	BWREG,TTYGUY
50000		MOVS	16,16		;CHANGE HALVES IF TTYGUY IS MOVING NOW
50100		ORM	16,GB3(TAC)
50200	;**********
50300	;	WE HAVE COMPLETED THE DIRECT PROPERTY EXTRACTION FOR THIS
50400	;POINT, ALTHOUGH MORE BITS CAN BE TURNED ON WHEN THE POINT IS PROCESSED
50500	;FOR THE OTHER SIDE OR WHEN NEARBY POINTS ARE PROCESSED.
50600	;**********
50700		MOVE	16,R16SAV
50800		XORI	BWREG,1		;SET BWREG FOR UNTAC1
50900		MOVEM	BWREG,WBSAV
51000		JRST	EXITPT
     

00100	;**********
00200	;	THIS IS THE LEGAL MOVE ENTRY POINT.  AFTER THE MOVE IS CHECKED FOR
00300	;LEGALITY, IT IS ENTERED INTO THE GAME RECORD.  A BACKUP FACILITY IS 
00400	;PROVIDED TO ENABLE A LOOK-AHEAD OF MORE THAN ONE PLY.
00500	;**********
00600	LEGAL:	PUSHJ	PDP,STRT
00700		PUSHJ	PDP,STRNGS-1
00800		PUSH	PDP,
00900	;**********
01000	;	MAKMOV ACTUALLY CHANGES THE DATA STRUCTURE TO RECORD THE MOVE
01100	;JUST ANALYZED.  FIRST THE CURRENT FRIENDLY STRING (INCLUDING THE MOVE
01200	;AT TAC) IS PRODUCED.  THEN ANY CAPTURED MEN ARE ERASED.  FINALLY, THE
01300	;POINT AT TAC IS MARKED "OCCUPIED BY FRIENDLY".
01400	;**********
01500	MAKMOV:	HRLZ	TAC1,TACSAV	;PUT MARK OF (-TAC,KOTAC) ON STSTAK
01600		MOVN	TAC1,TAC1
01700		HRR	TAC1,KOTAC	;SAVE OLD KO POINT FOR RESTORING BY UNMOVE
01800		PUSH	STKREG,TAC1
01900		EXCH	STKREG,STKPTR		;UPDATE STACK POINTER
02000		SETZM	NODANS       ;HOLDS # STONES IN ENDANGERED FRIENDLY STRINGS
02100	;*****KO CHECKING
02200		MOVE	TAC3,TACCPT
02300		SOJN	TAC3,NOKO	;IS EXACTLY ONE MAN CAPTURED
02400		HRRZ	TAC1,NSTRNG
02500		TRNN	TAC1,AWSRRM-1	;DOES CURRENT MOVE HAVE EXACTLY ONE LIBERTY
02600		TRNE	TAC1,AWSLRH*(AWSRRM-1)	;EXACTLY ONE FRIENDLY STONE
02700	NOKO:	TDZA	TAC1,TAC1	;ZERO OUT OLD KO POINT
02800		MOVE	TAC1,CAPTST	;RECORD KO LOCATION
02900		MOVEM	TAC1,KOTAC
03000		HRRM	STKREG,ADJSTR		;SET UP RELEASE LOOP
03100		HRRZ	ENEMY,FRND(BWREG)	;NOTE ENEMY=STKREG
03200		JUMPE	REPLCE,ADJSTR-1		;NO FRIENDLY NEIGHBORS
03300		MOVE	TAC1,STRPTR(REPLCE)
03400		TLNE	TAC1,DEDBIT+DANBIT
03500		ADDM	TAC1,NODANS		;STRING NOT ALIVE
03600		MOVEI	CLEAR,AWSRRH*AWSRRM
03700		ANDM	CLEAR,STRPTR(REPLCE)
03800		ANDCA	CLEAR,NSTRNG
03900		ORM	CLEAR,STRPTR(REPLCE)	;SET STRING DATA FOR LIB ADJUSTMENT
04000		SOS	STRPTR(REPLCE)		;SUBTRACT LIB UNDER THE NEW STONE
04100		MOVE	TAC,TACSAV		;ADD NEW POINT TO OLD STRING
04200		SKIPN	SEARCH,STRPTR		;MAKE SURE SEARCH WILL FAIL
04300		SAILERR <4>		;STOP IF NO STRINGS LEFT 
04350							;**** ERROR MESSAGE 4 ****
04400		MOVEI	CLEAR,4			;MAKE SURE ENOUGH LIBS ARE POSSIBLE
04500		PUSHJ	PDP,STRMAK
04600		AOS	ADJSTR
04700	ADJSTR:	SKIPG	SEARCH,0
04800		JRST	STRSFX
04900		CAMN	REPLCE,SEARCH
05000		JRST	ESTRNG+1
05100		LDB	TAC,[POINT 9,STRPTR(SEARCH),17];TAC IS BASE POINT OF STRING
05200		TDNN	FRIEND,GB1(TAC)
05300		JRST	ESTRNG
05400		MOVE	CLEAR,STRPTR(SEARCH)
05500		TLNE	CLEAR,DEDBIT+DANBIT
05600		ADDM	CLEAR,NODANS		;STRING NOT ALIVE
05700		ANDI	CLEAR,777
05800		SOJG	CLEAR,.+4		;AT LEAST ONE POSSIBLE LIB TO FIND
05900		MOVEI	CLEAR,177
06000		PUSHJ	PDP,DRIVER		;REPLACE NAME, NO LIBS TO FIND
06100		JRST	.+2
06200		PUSHJ	PDP,STRMAK	       ;ADD THIS FRIENDLY TO CURRENT STRING
06300		MOVE	TAC1,STRPTR		;RELEASE THE ADDED-ON STRING
06400		MOVEM	TAC1,STRPTR(SEARCH)
06500		MOVEM	SEARCH,STRPTR
06600		JRST	.+2
06700	ESTRNG:	SOS	STRPTR(SEARCH)		;NEW MAN TAKES UP ONE ENEMY LIBERTY
06800		AOS	ADJSTR
06900		JRST	ADJSTR-1
07000	;*****PUT IN NEW STRING IF THERE WERE NO FRIENDLY NEIGHBORS
07100	STRSFX:	HRRZ	TAC1,NODANS
07200		LSH	TAC1,-=9
07300		MOVEM	TAC1,NODANS	;# DEAD OR ENDANGERED STONES IN STRING
07400		JUMPN	REPLCE,STROK	;THERE WERE NEIGHBORS IF REPLCE≠0
07500		SKIPN	REPLCE,STRPTR
07600		JRST	NOSTR		;NO-STRINGS-LEFT ERROR
07700		MOVE	TAC,TACSAV
07800		ORM	REPLCE,GB1(TAC)
07900		MOVE	TAC2,NSTRNG	;PUT NSTRNG DATA INTO STRPTR(REPLCE)
08000		EXCH	TAC2,STRPTR(REPLCE)
08100		MOVEM	TAC2,STRPTR	;RESET FREE STRING POINTER
08200		SKIPE	CAPTST
08300		PUSHJ	PDP,CAPLOP-4
08400		MOVE	TAC,TACSAV
08500		XORM	FRIEND,GB1(TAC)	;MUST CHANGE BOARD AFTER CAPTURE PICKUP
08600		XORM	BLANK,GB1(TAC)
08700		JRST	STROK1
08800	
08900	;*****PICK UP THE CAPTURED STRING(S)
09000		MOVEI	TAC5,40			;SET BLANK FOR PUTBWB
09100		MOVEM	TAC5,CHRACT
09200		MOVEI	TAC1,CAPTST
09300		HRRM	TAC1,.+1	;NO SPARE REGISTERS FOR THIS LOOP
09400	CAPLOP:	SKIPN	TAC,0		;ADDR SET BY PROGRAM
09500		POPJ	PDP,		;NO MORE CAPTURED STRINGS TO PROCESS
09600		MOVE	SEARCH,GB1(TAC)
09700		ANDI	SEARCH,STRBTS*STRCNT
09800		MOVE	TAC1,STRPTR	;RELEASE CAPTURED STRING POINTER
09900		EXCH	TAC1,STRPTR(SEARCH)
10000		MOVEM	SEARCH,STRPTR	;UPDATE FREE STRING POINTER
10100		PUSHJ	PDP,PICKUP	;ERASE CURRENT CAPTURED STRING
10200		AOS	CAPLOP
10300		JRST	CAPLOP
10400	
10500	STROK:	MOVE	TAC,TACSAV
10600		MOVE	TAC1,NSTRNG
10700		TLNN	TAC1,DEDBIT
10800		JRST	.+3
10900		MOVEI	TAC1,210	;ERASE OCCBITS OF DEAD STRING
11000		ANDCAM	TAC1,GBOARD(TAC)
11100		XORM	FRIEND,GB1(TAC)	;MUST CHANGE GB1 BEFORE PICKING UP CAPTURES
11200		XORM	BLANK,GB1(TAC)
11300		SKIPE	CAPTST
11400		PUSHJ	PDP,CAPLOP-4
11500		MOVE	TAC,TACSAV
11600	STROK1:	TRNN	FRIEND,BLKOCC
11700		SKIPA	TAC5,[127]
11800		MOVEI	TAC5,102
11900		MOVEM	TAC5,CHRACT
12000		SKIPN	IIIDPY
12020		JRST EXITPT
12040		PUSH PDP,TAC
12060		PUSH PDP,CHRACT
12100		PUSHJ	PDP,PUTBWB
12200		JRST	EXITPT
12300	
12400	;**********
12500	;     WHEN THE DATA BASE HAS BEEN ADJUSTED (I.E., WHEN WE BACK UP MORE THAN
12600	;1 PLY), THERE IS A LOT MORE TO DO.  WE HAVE TO RESET A BUNCH OF REGISTERS,
12700	;UNSTACK AND REPLACE POSSIBLE CAPTURES, AND UNDO AN ARBITRARILY LARGE
12800	;FRIENDLY STRING CREATED ON THE LAST PLY.
12900	;**********
13000	UNMOV1:	SETOM	FORCMV
13100		SOSA	FORCMV
13200	UNMOVE:	SETOM	FORCMV
13300		MOVE	STKREG,STKPTR
13400		POP	STKREG,TAC
13500		HRRZM	TAC,KOTAC
13600		ASH	TAC,-22
13700		MOVN	TAC,TAC
13800		MOVEM	TAC,TACSAV
13900		MOVEI	BLANK,BNKOCC
14000		MOVEI	FRIEND,WHTOCC+BLKOCC
14100		AND	FRIEND,GB1(TAC)
14200		MOVE	BWREG,FRIEND
14300		LSH	BWREG,WHTSHF
14400	;*****RESET NEIGHBORS
14500		MOVE	TAC1,GB1(TAC)
14600		ANDI	TAC1,177
14700		MOVE	TAC1,STRPTR(TAC1)
14800		TLNN	TAC1,DEDBIT
14900		JRST	.+5
15000		CAIE	FRIEND,BLKOCC
15100		SKIPA	TAC1,[OCCBIT*WHTNGH]
15200		MOVEI	TAC1,OCCBIT*BLKNGH
15300		ORM	TAC1,GBOARD(TAC)
15400		SKIPGE	TAC5,FORCMV
15500		PUSHJ	PDP,NEIIN2+1
15600	;*****PROCESS POSSIBLE CAPTURES
15700		TRNE	FRIEND,BLKOCC
15800		SKIPA	TAC5,[127]
15900		MOVEI	TAC5,102
16000		MOVEM	TAC5,CHRACT
16100		MOVEI	CLEAR,STRCNT*STRBTS
16200		MOVEM	STKREG,STKPTR	;SAVE STKREG FOR SECOND PASS (FRLOOP)
16300	CPLOOP:	SKIPG	0(STKREG)
16400		JRST	CPLOO1		;END OF STACKED STRINGS FOR THIS PLY
16500		POP	STKREG,TAC1
16600		POP	STKREG,REPLCE
16700		HLRZ	TAC,TAC1
16800		ANDI	TAC,777		;GET RID OF FLAG BITS
16900		TDNE	FRIEND,GB1(TAC)
17000		JRST	CPLOOP
17100		TDNN	BLANK,GB1(TAC)
17200		JRST	CPLOO1-3
17300		CAME	REPLCE,STRPTR	;REACQUIRE STRING DATA SLOT
17400		SAILERR <5>		;******** ERROR MESSAGE 5 ********
17500		MOVE	TAC2,TAC1
17600		EXCH	TAC2,STRPTR(REPLCE)
17700		MOVEM	TAC2,STRPTR	;RESET	STRING	POINTER
17800		MOVEM	STKREG,TACSV1
17900		MOVEI	ENEMY,WHTOCC+BLKOCC	;NOTE ENEMY=STKREG
18000		XOR	ENEMY,FRIEND
18100		PUSHJ	PDP,PUTDON
18200		SKIPA	STKREG,TACSV1
18300		MOVEM	TAC1,STRPTR(REPLCE)	;RESTORE UNCAPTURED ENEMY
18400		SETZM	2(STKREG)	;MARK NAME FOR SECOND PASS
18500		JRST	CPLOOP
18600	CPLOO1:	EXCH	STKREG,STKPTR	;RESET	STKPTR TO TOP OF PREVIOUS PLY STACK
18700	;*****UNDO THE CURRENT POINT
18800		MOVE	TAC,TACSAV
18900		MOVEI	SEARCH,STRCNT*STRBTS
19000		AND	SEARCH,GB1(TAC)
19100		ANDCAM	CLEAR,GB1(TAC)
19200		XORM	BLANK,GB1(TAC)
19300		TDNN	FRIEND,GB1(TAC)
19400		SAILERR <6>		;******** ERROR MESSAGE 6 ********
19500		XORM	FRIEND,GB1(TAC)
19600		MOVEI	TAC5,40
19700		MOVEM	TAC5,CHRACT
19800		SKIPN	IIIDPY
19820		JRST .+4
19840		PUSH PDP,TAC
19860		PUSH PDP,CHRACT
19900		PUSHJ	PDP,PUTBWB
20000		MOVE	TAC1,STRPTR(SEARCH)
20100		TRNE	TAC1,AWSLRH*(AWSLRM-1)
20200		JRST	FRLOOP
20300	;*****RELEASE THE CURRENT (ONE-MAN) STRING
20400		MOVE	TAC2,STRPTR
20500		MOVEM	TAC2,STRPTR(SEARCH)
20600		MOVEM	SEARCH,STRPTR
20700		POPJ	PDP,
20800	;*****RESET OLD FRIENDLY STRINGS
20900	FRLOOP:	SKIPGE	TAC1,0(STKREG)
21000		POPJ	PDP,
21100		JUMPE	TAC1,FRLOP1
21200		MOVE	REPLCE,-1(STKREG)
21300		CAME	SEARCH,REPLCE
21400		JRST	.+3
21500		MOVEM	TAC1,STRPTR(SEARCH)
21600		JRST	FRLOP1
21700		CAME	REPLCE,STRPTR	;REACQUIRE OLD NAME FOR A PIECE OF FRIENDLY
21800		SAILERR <7>		;******** ERROR MESSAGE 7 ********
21900		EXCH	TAC1,STRPTR(REPLCE)
22000		MOVEM	TAC1,STRPTR	;RESET FREE STRING POINTER
22100		LDB	TAC,[POINT 9,STRPTR(REPLCE),17]
22200		PUSHJ	PDP,DRIVER	;RENAME BOARD POINTS IN STRING
22300	FRLOP1:	SUBI	STKREG,2
22400		JRST	FRLOOP
     

00100	BEGIN	DANBLK
00200	
00300	;**********
00400	;	COUNT AVAILABLE BOARD POINTS TO EXPAND INTO FROM A PARTICULAR
00500	;GROUP OR STRING.  IF A GROUP CAN BE FREELY EXPANDED, THEN IT IS ALMOST
00600	;SAFE.  TAC MUST BE SET TO A LOCATION IN THE GROUP OR STRING, AND CLEAR
00700	;MUST BE SET TO THE NUMBER OF ECPANSION POINTS DESIRED.
00800	;**********
00900	NXTENM:	0
01000	EXPSPC:	MOVEI	TAC5,BKOUT
01100		MOVEI	TAC4,NONOCC
01200		MOVE	TAC2,TAC
01300		IDIVI	TAC2,BRDWTH
01400		MOVEM	TAC2,ICOUNT	;SET UP LINE 1 DETECTION
01500		MOVEM	TAC3,JCOUNT
01600		CAIE	TAC2,=19
01700		CAIN	TAC2,1
01800		MOVE	TAC3,TAC2
01900		MOVE	TAC2,GB1(TAC)
02000		TRNN	TAC2,BLKOCC
02100		SKIPA	SEARCH,[WCON+HWCON]
02200		SKIPA	SEARCH,[BCON+HBCON]
02300		SKIPA	REPLCE,[BLKNGH*NGHBTS]
02400		SKIPA	REPLCE,[WHTNGH*NGHBTS]
02500		SKIPA	TAC2,[SECCON]
02600		HRLZI	TAC2,SECCON
02700		SKIPE	TTYGUY
02800		MOVS	TAC2,TAC2
02900		MOVEM	TAC2,NXTENM	;"NEAR ENEMY GROUP" MARK
03000		MOVEI	TAC2,377
03100	EXPSPA:	TDNE	TAC2,GBOARD(TAC)
03200		JRST	EXPSP1-1
03300		MOVE	TAC1,GB3(TAC)	;CHECK FOR NEXT-TO-GROUP POINT
03400		TDNN	TAC1,[XWD SECCON,SECCON]
03500		JRST	.+4		;NOT NEXT-TO-GROUP
03600		TDNN	TAC1,NXTENM
03700		JRST	EXPSP1-1	;ONLY NEXT-TO-FRIENDLY-GROUP
03800		POPJ	PDP,		;NEXT TO ENEMY GROUP
03900		CAIG	TAC3,=18
04000		CAIG	TAC3,1
04100		POPJ	PDP,
04200		SOJLE	CLEAR,.-1	;FOUND ANOTHER POINT, DECREMENT "CLEAR"
04300		MOVEI	TAC1,3
04400	EXPSP1:	TDNN	TAC5,@GBDTST(TAC1)
04500		TDNE	TAC4,@GB1TST(TAC1)
04600		JRST	EXPSP2
04700		ORM	TAC5,@GBDTST(TAC1)
04800		TDNE	SEARCH,@GBDTST(TAC1)
04900		JRST	EXPSP3			;FRIENDLY GROUP POINT
05000		TDNE	REPLCE,@GBDTST(TAC1)
05100		JRST	EXPSP2			;NEXT TO ENEMY STONE
05200		HRRZ	TAC3,INCCNT+1(TAC1)
05300		MOVE	TAC3,0(TAC3)		;GET CONSTANT INDEX
05400		CAILE	TAC3,1
05500		CAILE	TAC3,=18
05600		JRST	EXPSP2			;DONT CRAWL ON LINE 1
05700	EXPSP3:	XCT	INCCNT(TAC1)
05800		MOVEI	TAC,@GODOWN(TAC1)
05900		HRLM	TAC1,0(PDP)
06000		PUSHJ	PDP,EXPSPA
06100		HLRZ	TAC1,0(PDP)
06200		MOVEI	TAC,@GODOWN+2(TAC1)
06300		XCT	INCCNT+2(TAC1)
06400		JUMPLE	CLEAR,EXPSP2+1
06500	EXPSP2:	SOJGE	TAC1,EXPSP1
06600		POPJ	PDP,
06700	
06800	INCCNT:	SOS	TAC3,ICOUNT
06900		SOS	TAC3,JCOUNT
07000		AOS	TAC3,ICOUNT
07100		AOS	TAC3,JCOUNT
07200		SOS	TAC3,ICOUNT
07300		SOS	TAC3,JCOUNT
07400	ICOUNT:	0
07500	JCOUNT:	0
07600	
07700	;**********
07800	;	ERASE THE BKOUT BITS SET BY EXPSPC.  TAC MUST BE SET ON ENTRANCE.
07900	;**********
08000	BKERAS:	MOVEI	TAC2,BKOUT
08100		ANDCAM	TAC2,GBOARD(TAC)
08200		MOVEI	TAC1,3
08300	BKERA2:	TDNN	TAC2,@GBDTST(TAC1)
08400		JRST	BKERA1
08500		MOVEI	TAC,@GODOWN(TAC1)
08600		HRLM	TAC1,0(PDP)
08700		PUSHJ	PDP,BKERAS+1
08800		HLRZ	TAC1,0(PDP)
08900		MOVEI	TAC,@GODOWN+2(TAC1)
09000	BKERA1:	SOJGE	TAC1,BKERA2
09100		POPJ	PDP,
09200	
09300	;**********
09400	;	COUNT THE BLANKS NEXT TO A POINT.  THIS IS USED TO SEE IF TWO
09500	;ADJACENT EYE-MAKING MOVES ARE A SURE EYE OR TWO SURE EYES (OR NO
09600	;SURE EYES).  IF THE TOTAL BLANKS IS ≥4 AND THERE ARE NO NON-DEAD
09700	;OPPOSING STONES AROUND, THEN WE HAVE TWO EYES.
09800	;**********
09900		0			;HOLDS COUNT OF BLANKS
10000	BNKCNT:	MOVEI	TAC1,3
10100		MOVE	TAC4,@GB1TST(TAC1)
10200		TRNE	TAC4,BNKOCC
10300		JRST	BNKCN1-1	;ADJACENT BLANK
10400		TDNN	TAC4,ENEMY
10500		JRST	BNKCN1
10600		ANDI	TAC4,177
10700		MOVE	TAC4,STRPTR(TAC4)
10800		TLNE	TAC4,DEDBIT
10900		JRST	BNKCN1-1	;ADJACENT DEAD ENEMY
11000		SETOM	BNKCNT-1	;ADJACENT ALIVE ENEMY
11100		POPJ	PDP,
11200		AOS	BNKCNT-1
11300	BNKCN1:	SOJGE	TAC1,BNKCNT+1
11400		POPJ	PDP,
11500	
11600	;**********
11700	;	ENDANG DOES THE FINAL CALCULATIONS AND POLISHING UP OF THE GLOBAL
11800	;EVALUATOR.  THE IDEA IS TO IMPROVE ON THE NOMOVE DATA BY ADDING IN SOME
11900	;PROPERTIES THAT DEPEND ON MORE THAN ONE POINT.
12000	;**********
12100	↑↑ENDANG:MOVEM	16,R16SAV
12200		MOVEM	PDP,PDPSAV
12300		MOVE	16,MSCVAL
12400		MOVE	PDP,PNTDPY	;NEED BIG PDL FOR EXPSPA
12500		ADD	PDP,[IOWD =450,=10]
12600	
12700	;**********
12800	;	POLISHING LOOP #1
12900	;	SEE IF THERE ARE ANY IMPLIED GROUP SPLITTINGS AND ALSO SEE
13000	;WHICH MOVES ADD TO AREA FOR EITHER OR BOTH SIDES.
13100	;**********
13200		MOVEI	TAC,BRDWTH*BRDWTH-1
13300		MOVEI	BLANK,NONOCC
13400	POLOP1:	TDNE	BLANK,GB1(TAC)		;IS POINT OFF EDGE
13500		JRST	POLP11
13600	;*****TRY FOR IMPLIED GROUP SPLITTING
13700		MOVE	TAC2,GB3(TAC)
13800		CAMN	TAC2,[-1]
13900		JRST	POLP11			;ILLEGAL MOVE FOR FRIENDLY
14000		TDNE	TAC2,[150000150]
14100		JRST	ARACLC-2		;THIS POINT HAS CAPTURE OR TWOLIB
14200		TRNE	TAC2,CMFRDG
14300		TLNN	TAC2,CMFRDG
14400		JRST	.+3
14500		TDO	TAC2,[XWD SPLENG,SPLENG]
14600		JRST	ARACLC-3
14700		TDNE	TAC2,[XWD ENMGRP,ENMGRP]
14800		JRST	ARACLC-2       ;SOLID CONNECTIONS, SPLITS HANDLED ELSEWHERE
14900		AND	TAC2,[XWD CMFRDG+EXPFGP+SECCON,EXPFGP+SECCON]
15000		CAMN	TAC2,[XWD CMFRDG+EXPFGP+SECCON,EXPFGP+SECCON]
15100		TRO	TAC2,SPLENG		;SPLITS ENEMY GROUP
15200		ORM	TAC2,GB3(TAC)
15300		MOVE	TAC2,GB3(TAC)
15400		AND	TAC2,[XWD EXPFGP+SECCON,CMFRDG+EXPFGP+SECCON]
15500		CAMN	TAC2,[XWD EXPFGP+SECCON,CMFRDG+EXPFGP+SECCON]
15600		TLO	TAC2,SPLENG		;SPLITS FRIENDLY GROUP
15700		ORM	TAC2,GB3(TAC)
15800	;**********
15900	;	DEFINE WHICH MOVES CAN MAKE AREA FOR EACH SIDE.  NOTE THAT MAKING
16000	;"AREA" IN THE CENTER MEANS OBSTRUCTING THE ABILITY OF THE OTHER SIDE
16100	;TO EXPAND ITS GROUPS.
16200	;**********
16300		MOVEI	BWREG,1
16400		MOVEI	ENEMY,BLKOCC
16500	ARACLC:	XORI	ENEMY,WHTOCC+BLKOCC
16600		MOVE	CLEAR,GB3(TAC)
16700		CAMN	BWREG,TTYGUY
16800		MOVS	CLEAR,CLEAR
16900		HLRE	TAC1,GBOARD(TAC)
17000		XCT	JUMPER+2(BWREG)
17100		TRO	CLEAR,ENMGRD	;ON ENEMY-INFLUENCED POINT
17200		LDB	TAC1,[POINT 6,GB1(TAC),5]
17300		JUMPE	TAC1,NOAREA
17400		MOVE	TAC1,AREAPT(TAC1)
17500		XCT	JUMPER+2(BWREG)
17600		TROA	CLEAR,ENAREA	;ENEMY AREA POINT
17700		TLO	CLEAR,ENAREA	;ON OWN AREA POINT
17800	;**********
17900	;	THIS CHECK FOR TWO ADJACENT EYE-MAKING MOVES IS USED TO
18000	;PREVENT MAKING A ONE-POINT EYE OUT OF A TWO-POINT EYE.  IT HELPS
18100	;THE GROUP ENDANGERED CALCULATION BY DETECTING SAFE EYE SHAPES.
18200	;**********
18300	NOAREA:	TRNE	CLEAR,FRDEYE
18400		TRNE	CLEAR,SAVFRS
18500		JRST	EYES1+1		;NOT NON-URGENT EYEMAKING POINT
18600		SETZM	BNKCNT-1	;COUNTS # ADJACENT BLANKS
18700		MOVEI	TAC3,3
18800	EYES0:	CAME	BWREG,TTYGUY
18900		SKIPA	TAC2,@GB3TST(TAC3)
19000		MOVS	TAC2,@GB3TST(TAC3)
19100		CAMN	TAC2,[-1]
19200		JRST	EYES1		;OCCUPIED OR ILLEGAL POINT
19300		TRNE	TAC2,FRDEYE
19400		TRNE	TAC2,SAVFRS
19500		JRST	EYES1
19600	;*****WE HAVE TWO ADJACENT EYEMAKERS
19700		PUSHJ	PDP,BNKCNT
19800		SKIPG	BNKCNT-1
19900		JRST	EYES1+1		;EYEMAKER WAS URGENT
20000		MOVEI	TAC,@GODOWN(TAC3)
20100		PUSHJ	PDP,BNKCNT
20200		CAME	BWREG,TTYGUY
20300		SKIPA	TAC4,GB2(TAC)
20400		MOVS	TAC4,GB2(TAC)
20500		MOVEI	TAC,@GODOWN+2(TAC3)
20600		SKIPG	TAC1,BNKCNT-1
20700		JRST	EYES1+1		;EYEMAKER WAS URGENT
20800		MOVEI	TAC2,EYE
20900		ORM	TAC2,GBOARD(TAC)	;MARK EYE POINT
21000		ORM	TAC2,@GBDTST(TAC3)
21100		SETOM	GB3(TAC)		;DONT PLAY ON EYE
21200		SETOM	@GB3TST(TAC3)
21300		HRLZI	TAC2,EYEVAL	;GIVE CREDIT FOR ONE EYE
21400		CAIL	TAC1,4
21500		LSH	TAC2,1		;GIVE CREDIT FOR TWO EYES
21600	;*****FIND NAME OF GROUP TO REWARD
21700		ANDI	TAC4,77
21800		JUMPN	TAC4,EYES2	;OTHER POINT HAS NAME
21900		CAME	BWREG,TTYGUY
22000		SKIPA	TAC4,GB2(TAC)
22100		MOVS	TAC4,GB2(TAC)
22200		ANDI	TAC4,77
22300		JUMPN	TAC4,EYES2	;CURRENT POINT HAS NAME
22400		MOVE	TAC1,GB1(TAC)
22500		LSH	TAC1,-=30	;AREA NAME
22600		SKIPN	TAC1
22700		JRST	EYES1+1		;CANT FIND GROUP NAME
22800		MOVS	TAC4,AREAPT(TAC1)
22900		ANDI	TAC4,777	;AREA BASE POINT ADDRESS
23000		LDB	TAC4,[POINT 7,GB1(TAC4),28]	;GROUP NAME
23100	EYES2:	ADDM	TAC2,GRPPTR+2*MXARNO(TAC4)	;ADD EYE BONUS
23200		JRST	POLP11
23300	EYES1:	SOJGE	TAC3,EYES0
23400		TDNE	CLEAR,[XWD NDNGST,NDNGST]
23500		JRST	POLP12		;THIS MOVE ENDANGERS ITSELF
23600		MOVE	TAC2,GBOARD(TAC)
23700		TRNE	TAC2,DAME		;DAME POINT DOESN'T MAKE AREA
23800		JRST	POLP12			;OR HINDER EXPANSION
23900		MOVE	TAC2,TAC
24000		IDIVI	TAC2,BRDWTH
24100		MOVEM	TAC2,ICOUNT
24200		MOVEM	TAC3,JCOUNT
24300		SUBI	TAC2,=10
24400		MOVM	TAC2,TAC2	;TAC2>6 MEANS I ON THIRD LINE OR LOWER
24500		SUBI	TAC3,=10
24600		MOVM	TAC3,TAC3	;TAC3>6 MEANS J ON THIRD LINE OR LOWER
24700	;*****TRY FOR FIRST LINE AREA-MAKER
24800		CAIN	TAC2,=9		;ELIMINATE THE FIRST LINE
24900		JRST	.+3
25000		CAIE	TAC3,=9
25100		JRST	NOARE1		;NOT ON FIRST LINE
25200		TRNE	CLEAR,CMFRDG
25300		JRST	ARDONE		;CONNECTS FRIENDLY GROUPS
25400		TRNN	CLEAR,SECCON
25500		JRST	NOAR01
25600		TLNN	CLEAR,SECCON	;SECURE EXTENSION FROM ENEMY
25700		TRNE	CLEAR,ENAREA+SAVFRS+ATARES
25800		TRO	CLEAR,EXPFRA+ENBLOK	;AREA, EXPANSION
25900		JRST	ARDONE+1
26000	NOAR01:	TRNE	CLEAR,EXPFGP
26100		TRNN	CLEAR,ENAREA
26200		JRST	ARDONE+1
26300		TRNN	CLEAR,ENMGRP
26400		TRO	CLEAR,EXPFRA+ENBLOK	;SMALL MONKEY-JUMP
26500		JRST	ARDONE+1
26600	JUMPER:	SKIPGE	GBOARD(TAC2)
26700		SKIPLE	GBOARD(TAC2)
26800		SKIPLE	TAC1
26900		SKIPGE	TAC1
27000	;*****TRY FOR LINE 2 AREA-MAKER
27100	NOARE1:	CAIN	TAC2,=8
27200		JRST	.+3
27300		CAIE	TAC3,=8
27400		JRST	NOARE2		;NOT ON SECOND LINE
27500		TRNE	CLEAR,CMFRDG
27600		JRST	ARDONE		;CONNECTS FRIENDLY GROUPS
27700		TRNN	CLEAR,SECCON
27800		JRST	NOAR11
27900		TRNN	CLEAR,TWOLFS+NDNGST
28000		TDNN	CLEAR,[XWD SECCON,ENAREA+ENMGRP+SAVFRS]
28100		JRST	ARDONE+1
28200		TLNE	CLEAR,SECCON
28300		TRO	CLEAR,ENBLOK	;HINDERS ENEMY DEVELOPMENT
28400		JRST	ARDONE
28500	NOAR11:	TRNE	CLEAR,EXPFGP
28600		TRNE	CLEAR,ENMGRP+TWOLFS+NDNGST
28700		JRST	ARDONE+1
28800		TLNN	CLEAR,SECCON
28900		JRST	ARDONE+1
29000		TLO	CLEAR,EXPFRA+ENBLOK    ;ENEMY AREA-MAKER, FRIENDLY EXPANDER
29100		TRO	CLEAR,EXPFRA+ENBLOK	;HINDERS ENEMY EXPANSION
29200		JRST	ARDONE+1
29300	;*****LINE 3 AREA-MAKER POINT
29400	NOARE2:	SETZM	NBLNKS		;FLAG FOR AREA-MAKING AWARDS
29500		CAIE	TAC2,7
29600		JRST	NOAR21
29700		MOVE	TAC4,ICOUNT
29800		MOVEI	TAC5,BRDWTH-2(TAC)
29900		CAIG	TAC4,=10
30000		SUBI	TAC5,3*BRDWTH
30100		MOVEI	TAC4,4(TAC5)
30200		TDNN	ENEMY,GB1(TAC4)		;MAKE SURE LINES 1,2 ARE NOT ENEMY
30300		TDNE	ENEMY,GB1+BRDWTH(TAC4)
30400		JRST	ARDONE+1
30500		CAME	TAC4,TAC5
30600		SOJA	TAC4,.-4
30700		JRST	NOAR22
30800	NOAR21:	CAIE	TAC3,7
30900		JRST	NOARE3
31000		MOVE	TAC4,JCOUNT
31100		MOVEI	TAC5,-2*BRDWTH+1(TAC)
31200		CAIG	TAC4,=10
31300		SUBI	TAC5,3
31400		MOVEI	TAC4,4*BRDWTH(TAC5)
31500		TDNN	ENEMY,GB1(TAC4)
31600		TDNE	ENEMY,GB1+1(TAC4)
31700		JRST	ARDONE+1
31800		SUBI	TAC4,BRDWTH
31900		CAML	TAC4,TAC5
32000		JRST	.-5
32100	NOAR22:	JUMPE	CLEAR,ARDONE-2	;MAKES AREA IF NOTHING NEARBY
32200		TRNN	CLEAR,CMFRDG
32300		JRST	.+4
32400		XCT	JUMPER(BWREG)
32500		SKIPE	NENEMY
32600		JRST	ARDONE
32700		TRNN	CLEAR,SECCON
32800		JRST	NOAR23
32900		TRNE	CLEAR,TWOLFS+NDNGST
33000		JRST	ARDONE+1
33100		TLNN	CLEAR,SECCON
33200		JRST	NOARE3		;TRY FOR HINDERING EXPANSION
33300		TRO	CLEAR,ENBLOK	;HINDERS ENEMY EXPANSION
33400		TLO	CLEAR,ENBLOK	;HINDERS FRIENDLY EXPANSION
33500		JRST	ARDONE
33600	NOAR23:	SETOM	NBLNKS
33700		TRNE	CLEAR,EXPFGP
33800		TLNN	CLEAR,SECCON
33900		JRST	NOARE3
34000		TRNN	CLEAR,BADHAF
34100		TRNN	CLEAR,TWOLFS+NDNGST
34200		TRNE	CLEAR,ENMGRP
34300		JRST	ARDONE+1
34400		JRST	ARDONE-2
34500	;*****LINE >3 AREA-MAKER POINT
34600	NOARE3:	TRNN	CLEAR,EXPFGP
34700		JRST	ARDONE+1
34800		MOVEI	TAC1,3
34900		MOVEI	TAC4,BLKOCC+WHTOCC
35000		TDNN	TAC4,@GB1TST(TAC1)
35100		TDNE	TAC4,@G1DIAG(TAC1)
35200		JRST	ARDONE+1
35300		SOJGE	TAC1,.-3
35400		TLO	CLEAR,ENBLOK	;HINDERS FRIENDLY DEVELOPMENT
35500		SKIPN	NBLNKS
35600		JRST	ARDONE+1
35700		TRO	CLEAR,EXPFRA	;MAKES FRIENDLY AREA ON 3RD LINE
35800		TLOA	CLEAR,EXPFRA	;RESTRICTS FRIENDLY DEVELOPMENT
35900	ARDONE:	TRO	CLEAR,EXPFRA	;MAKES MORE FRIENDLY AREA
36000		TLNN	CLEAR,ENMGRP		;IF NEXT TO FRIENDLY
36100		JRST	POLP12			;STONE, THEN MUST BE
36200		TRNN	CLEAR,ENMGRP		;NEXT TO ENEMY STONE
36300		TRZ	CLEAR,EXPFRA		;ALSO TO MAKE AREA
36400	POLP12:	CAMN	BWREG,TTYGUY
36500		MOVS	CLEAR,CLEAR
36600		MOVEM	CLEAR,GB3(TAC)
36700		SOJGE	BWREG,ARACLC
36800	POLP11:	SOJGE	TAC,POLOP1
36900	
37000	;**********
37100	;	A KEY STRING IS ONE WHICH SEPARATES TWO OR MORE ENEMY GROUPS.
37200	;THIS SECTION OF KILLIV FINDS ALL SUCH KEY STRINGS.
37300	;**********
37400		MOVEI	ENEMY,176
37500	KEYSTN:	MOVE	TAC1,STRPTR(ENEMY)
37600		TLZE	TAC1,KEYBIT	;CLEAR "KEY STRING" BIT
37700		MOVEM	TAC1,STRPTR(ENEMY)
37800		TLNE	TAC1,DEDBIT
37900		JRST	KEYST1		;DEAD STRING CANT BE KEY
38000		HRRZ	TAC2,STRPTR(ENEMY)
38100		CAIL	TAC2,12000
38200		JRST	KEYST2		;≥10 STONES MUST BE KEY
38300		CAIG	TAC2,1000
38400		JRST	KEYST1		;NO STRING IN THIS SLOT
38500		MOVE	SEARCH,ENEMY
38600		PUSHJ	PDP,CONNCT
38700		SKIPN	WHTARM+1
38800		TDZA	TAC1,TAC1
38900	KEYST2:	HRLZI	TAC1,KEYBIT
39000		ORM	TAC1,STRPTR(ENEMY)
39100	KEYST1:	SOJGE	ENEMY,KEYSTN
39200	;**********
39300	;	IF ONE-MAN STRING IS KEY AND PART OF A CROSS-CUT IN WHICH
39400	;THE OTHER PART OF THE CROSS-CUT IS ENDANGERED, THEN ERASE THE KEYNESS
39500	;OF THE ONE-MAN STRING.
39600	;**********
39700		MOVEI	REPLCE,776000
39800		MOVEI	SEARCH,176
39900		HRLZI	CLEAR,KEYBIT
40000		HRLZI	TAC4,DANBIT
40100		SETZ	TAC3,
40200	KEYST3:	TDNN	REPLCE,STRPTR(SEARCH)
40300		TDNN	CLEAR,STRPTR(SEARCH)
40400		JRST	KEYST4+1		;NOT KEY OR TOO BIG
40500		MOVEI	FRIEND,BLKOCC+WHTOCC
40600		MOVEI	ENEMY,BLKOCC+WHTOCC
40700		LDB	TAC,[POINT 9,STRPTR(SEARCH),17]
40800		AND	FRIEND,GB1(TAC)
40900		XOR	ENEMY,FRIEND
41000		MOVEI	TAC1,3
41100	KEYST5:	TDNN	FRIEND,@G1DIAG(TAC1)
41200		JRST	KEYST4			;NOT FRIENDLY
41300		TDNE	ENEMY,@GB1TST(TAC1)
41400		TDNN	ENEMY,@GB1TST+3(TAC1)
41500		JRST	KEYST4
41600		LDB	TAC2,[POINT 7,@G1DIAG(TAC1),35]
41700		TDNE	TAC4,STRPTR(TAC2)
41800		TDNN	CLEAR,STRPTR(TAC2)
41900		JRST	KEYST4			;NOT KEY ENDANGERED FRIENDLY
42000		MOVEM	SEARCH,WHTARM(TAC3)
42100		AOJ	TAC3,
42200	KEYST4:	SOJGE	TAC1,KEYST5
42300		SOJGE	SEARCH,KEYST3
42400		SETZM	WHTARM(TAC3)
42500		SETZ	TAC3,
42600		SKIPN	TAC,WHTARM(TAC3)
42700		JRST	.+3
42800		ANDCAM	CLEAR,STRPTR(TAC)
42900		AOJA	TAC3,.-3
43000	
43100	;**********
43200	;    DECIDE WHICH GROUPS ON THE BOARD ARE ENDANGERED BY NEARBY ENEMY STONES
43300	;THE IDEA IS TO COUNT THE NUMBER OF EYES, AREAS, AREA POINTS, CONNECTION
43400	;POINTS, EXTENSIONS, LIBERTIES, ETC. TO DISCOVER "HOW BIG" A GROUP IS. IF
43500	;A GROUP IS FREE TO EXPAND, IT IT A LOT "BIGGER".  IF THE GROUP SEEMS TO
43600	;BE TOO SMALL AND IS SURROUNDED BY MUCH BIGGER GROUPS, THE SMALL GROUP IS
43700	;THOUGHT TO BE DEAD.
43800	;**********
43900		SETZM	DFLAG
44000		MOVEI	BLANK,MXARNO-1
44100	NDANG:	HRRZ	TAC,GRPPTR+MXARNO(BLANK)
44200		JUMPE	TAC,NDANG1
44300		HRRZ	FRIEND,GRPPTR(BLANK)
44400		MOVE	TAC2,FRIEND
44500		TRZN	FRIEND,777000
44600		JRST	NDANG4		;THIS GROUP HAS NO STONES
44700		LSH	TAC2,-5		;TAC2 HAS 16*(# STONES)
44800		LDB	TAC3,[POINT 9,GRPPTR+2*MXARNO(BLANK),17]     ;HALFEYES
44900		CAIL	TAC3,2*EYEVAL	;≥TWO "EYES" MEANS
45000		ADDI	TAC3,=50	;SAFE GROUP
45100		ADD	FRIEND,TAC3
45200		LDB	TAC3,[POINT 9,GRPPTR+2*MXARNO(BLANK),8]      ;AREAS
45300		SOJLE	TAC3,.+3
45400		LSH	TAC3,5		;320 FOR EACH EXTRA AREA
45500		ADD	FRIEND,TAC3
45600		LDB	TAC3,[POINT 9,GRPPTR+2*MXARNO(BLANK),26]     ;AREA POINTS
45700		ADD	FRIEND,TAC3
45800		LDB	TAC3,[POINT 9,GRPPTR+2*MXARNO(BLANK),35]     ;CONNECTIONS
45900		ADD	FRIEND,TAC3
46000		IMULI	FRIEND,=10
46100		LDB	TAC3,[POINT 9,GRPPTR+MXARNO(BLANK),8]	     ;EXTENSIONS
46200		CAML	TAC3,TAC2		;IF 16*(# STONES)≤(# EXTENSIONS)
46300		ADD	FRIEND,=21(16)		;THEN GROUP IS NEVER DEAD
46400		ADD	FRIEND,TAC3
46500		CAMLE	FRIEND,=19(16)
46600		JRST	NDANG4		;SUPERSAFE GROUP ALREADY
46700		CAML	FRIEND,=21(16)
46800		JRST	NDANG2
46900		LDB	TAC3,[POINT 7,GB1(TAC),35]
47000		MOVE	TAC3,STRPTR(TAC3)
47100		TLNN	TAC3,KEYBIT
47200		JRST	NDANG3		;NOT KEY AND "TOO SMALL"
47300	NDANG2:	MOVEI	CLEAR,=10
47400		PUSHJ	PDP,EXPSPC
47500		JUMPG	CLEAR,.+2
47600		ADD	FRIEND,=20(16)		;GROUP NOT ENCLOSED
47700		HRRZ	TAC,GRPPTR+MXARNO(BLANK)
47800		PUSHJ	PDP,BKERAS
47900		LDB	TAC1,[POINT 9,GRPPTR(BLANK),26]
48000		IMULI	TAC1,=10
48100		SUBM	FRIEND,TAC1
48200		CAMLE	TAC1,=22(16)		;MAX ENDANGERED SCORE
48300		JRST	NDANG4
48400		CAMLE	FRIEND,=22(16)		;SCORE-10*(# STONES)<=22(16)
48500		MOVE	FRIEND,=22(16)		;IS "HEAVY" AND ENDANGERED
48600	NDANG3:	CAIE	SEARCH,WCON+HWCON
48700		SKIPA	TAC1,BLDATA
48800		MOVE	TAC1,WHDATA
48900		AOS	=34(TAC1)
49000		LDB	TAC2,[POINT 9,GRPPTR(BLANK),27]
49100		ADDM	TAC2,=32(TAC1)
49200	NDANG4:	HRLM	FRIEND,GRPPTR+MXARNO(BLANK)
49300		CAMGE	FRIEND,=21(16)
49400		JRST	.+4
49500		CAMG	FRIEND,=22(16)
49600		SETOM	DFLAG
49700		JRST	NDANG1
49800		SKIPGE	DFLAG
49900		JRST	NDANG1
50000		CAMLE	FRIEND,DFLAG
50100		MOVEM	FRIEND,DFLAG		;BEST "HOPELESS" SCORE
50200	NDANG1:	SOJGE	BLANK,NDANG
50300		SKIPG	DFLAG
50400		JRST	NDANG6+1
50500		MOVE	TAC1,=21(16)
50600		SUB	TAC1,DFLAG
50700		HRLZI	TAC1,5(TAC1)		;MAKE "HOPELESS" ENDANGERED
50800		MOVEI	BLANK,MXARNO-1
50900	NDANG5:	HRRZ	TAC,GRPPTR+MXARNO(BLANK)
51000		JUMPE	TAC,NDANG6
51100		HRRZ	FRIEND,GRPPTR(BLANK)
51200		TRZE	FRIEND,777000
51300		ADDM	TAC1,GRPPTR+MXARNO(BLANK)	;SCALING UP SCORES
51400	NDANG6:	SOJGE	BLANK,NDANG5
51500	
51600	;**********
51700	;	POLISHING LOOP #2.
51800	;	PUT DOWN THE "NEAR ENDANGERED GROUP" MARKS FOR BOTH SIDES.  IF
51900	;THE GROUP IS SUPERSAFE, THEN REMOVE "MAKES TIGERMOUTH" AND "MAKES EYE"
52000	;CREDIT, AS THESE PROPERTIES ARE USELESS.
52100	;**********
52200		MOVEI	TAC,BRDWTH*BRDWTH-1
52300	DANLOP:	HLRZ	TAC1,GB2(TAC)	;ENEMY GROUP NAMES
52400		SETZ	TAC5,		;TESTS FOR "BOTH SIDES DEAD"
52500		SETZM	NFRND		;LARGEST FRIENDLY GROUP SCORE
52600		SETZM	NENEMY		;LARGEST ENEMY GROUP SCORE
52700		CAIN	TAC1,777777
52800		JRST	DANLP2-2	;MORE THAN THREE GROUPS CONNECTED
52900	DANE1:	MOVEI	TAC2,77
53000		AND	TAC2,TAC1	;PICK OFF A NAME
53100		JUMPE	TAC2,DANLP2	;NO MORE NAMES
53200		LSH	TAC1,-6		;SET UP FOR NEXT NAME
53300		HLRZ	TAC3,GRPPTR+MXARNO(TAC2)
53400		CAMLE	TAC3,NENEMY
53500		MOVEM	TAC3,NENEMY	;GET LARGEST GROUP SCORE
53600		CAMLE	TAC3,=22(16)
53700		JRST	DANE1
53800		CAMG	TAC3,=21(16)
53900		SOJA	TAC5,DANE1	;COUNT DEAD ENEMIES
54000		HRLZI	TAC4,GPNDNG	;NEAR ENEMY ENDANGERED GROUP
54100		ORM	TAC4,GB3(TAC)
54200	DANLP2:	HRRZ	TAC1,GB2(TAC)
54300		CAIN	TAC1,777777
54400		JRST	DANLP1-2
54500	DANF1:	MOVEI	TAC2,77
54600		AND	TAC2,TAC1
54700		JUMPE	TAC2,DANLP1
54800		LSH	TAC1,-6
54900		HLRZ	TAC3,GRPPTR+MXARNO(TAC2)
55000		CAMLE	TAC3,NFRND
55100		MOVEM	TAC3,NFRND	;GET LARGEST FRIENDLY GROUP SCORE
55200		CAMLE	TAC3,=22(16)
55300		JRST	DANF1
55400		CAMLE	TAC3,=21(16)
55500		JRST	DANLP1-2
55600		JUMPE	TAC5,DANF1
55700		;**********
55800		;	IF POINT IS NEAR BOTH "DEAD" FRIENDLY AND "DEAD"
55900		;ENEMY GROUPS, THEN MARK IT ENDANGERED FOR BOTH SIDES.  THIS
56000		;APPROXIMATION AIDS THE SAFETY CALCULATION IN COMPLEX
56100		;TACTICAL SITUATIONS.
56200		;**********
56300		HRLZI	TAC4,GPNDNG
56400		ORM	TAC4,GB3(TAC)
56500		MOVEI	TAC4,GPNDNG	;NEAR FRIENDLY ENDANGERED GROUP
56600		ORM	TAC4,GB3(TAC)
56700	DANLP1:	MOVE	TAC4,GB3(TAC)
56800		CAMN	TAC4,[-1]
56900		JRST	DANLP3
57000		TDNE	TAC4,[XWD NDNGST,NDNGST]
57100		JRST	DANLP4
57200		TLNN	TAC4,3000	;MAKES ENEMY EYE OR TIGERMOUTH
57300		JRST	DANLP5
57400		TLZ	TAC4,TWOLFS	;SELF-TWO-LIBBER IS IRRELEVANT
57500		TRNN	TAC4,EXPFGP
57600		JRST	DANLP5
57700		TDNN	TAC4,[XWD ENAREA,ENAREA]
57800		TLO	TAC4,EXPFRA	;MAKES ENEMY AREA
57900	DANLP5:	TRNN	TAC4,3000
58000		JRST	DANLP4
58100		TRZ	TAC4,TWOLFS
58200		TLNN	TAC4,EXPFGP
58300		JRST	DANLP4
58400		TDNN	TAC4,[XWD ENAREA,ENAREA]
58500		TRO	TAC4,EXPFRA
58600	DANLP4:	MOVE	TAC3,NENEMY
58700		CAMLE	TAC3,=19(16)
58800		TLZ	TAC4,3000	;SUPERSAFE GROUP DOESNT NEED MORE EYES
58900		MOVE	TAC3,NFRND
59000		CAMLE	TAC3,=19(16)
59100		TRZ	TAC4,3000
59200		MOVEM	TAC4,GB3(TAC)
59300	DANLP3:	SOJGE	TAC,DANLOP
59400	
59500	;**********
59600	;	POLISHING LOOP #3
59700	;	GIVE THE TIGERMOUTH MOVES THE VALUES OF THE DIRECT CONNECTION THEY
59800	;ARE REPLACING.  THIS MEANS CONNECTION, SPLITTING, AREA-MAKING, AND "NEAR
59900	;ENDANGERED GROUP" IF ANY OF THESE BITS ARE ON.
60000	;**********
60100		MOVEI	BLANK,BNKOCC
60200		MOVE	FRIEND,[XWD NDNGST,NDNGST]
60300		MOVE	TAC1,BRDDPY
60400	TIGEXP:	SKIPN	TAC,0(TAC1)
60500		JRST	TIGEX1+2
60600		MOVEI	TAC3,CMFRDG
60700		TLZN	TAC,777777
60800		TLOA	TAC3,SPLENG	;FRIENDLY SPREAD CONNECTION
60900		MOVS	TAC3,TAC3	;ENEMY SPREAD CONNECTION
61000		MOVE	TAC4,[XWD GPNDNG+EXPFRA+EXPFGP,GPNDNG+EXPFRA+EXPFGP]
61100		AND	TAC4,GB3(TAC)
61200		OR	TAC3,TAC4	;SPREAD THESE BITS TO TIGERMOUTH ALSO
61300		MOVEI	TAC2,3
61400		TDNN	BLANK,@GB1TST(TAC2)
61500		JRST	TIGEX1
61600		TDNN	FRIEND,@GB3TST(TAC2)
61700		ORM	TAC3,@GB3TST(TAC2)
61800	TIGEX1:	SOJGE	TAC2,.-4
61900		AOJA	TAC1,TIGEXP
62000	
62100		MOVE	PDP,PDPSAV
62200		MOVE	16,R16SAV
62300		POPJ	PDP,
62400	
62500	BEND
     

00100	BEGIN	AREABL
00200	
00300	;**********
00400	;	ARLOOP STARTS AT SELECTED NOT-AREA POINTS AND SEARCHES ALL
00500	;DIRECTIONS FOR NEIGHBORING NOT-AREA POINTS.  IT IS STOPPED BY ANY
00600	;BOUNDARY POINT TO A (POSSIBLE) FRIENDLY AREA.  THE TESTING REGISTERS
00700	;SHOULD BE SET AS FOLLOWS:
00800	;	1.  BLANK TO "NOT OCCUPIED" BIT IN GB1
00900	;	2.  FRIEND TO FRIENDLY OCCUPIED BIT IN GB1
01000	;	3.  ENEMY TO BLANK BOUNDARY POINT BIT IN GBOARD
01100	;	4.  REPLCE TO OFF-THE-EDGE BIT IN GB1
01200	;	5.  SEARCH TO STRONGLY RELATED FRIENDLY BIT IN GB3
01300	;	6.  CLEAR TO STRONGLY RELATED ENEMY BIT IN GB3
01400	;	7.  BWREG TO BAD AREA POINT BIT IN GBOARD
01500	;	8.  TAC TO CURRENT OFFSET ADDRESS
01600	;**********
01700	ARLOOP:	TDNE	REPLCE,GB1(TAC)
01800		POPJ	PDP,		;BEEN HERE ALREADY
01900		ORM	REPLCE,GB1(TAC)	;"BEEN HERE" MARK
02000		TDNE	BLANK,GB1(TAC)
02100		JRST	ARLOP2
02200	;*****THIS BOARD POINT IS OCCUPIED
02300		LDB	TAC2,[POINT 7,GB1(TAC),35]
02400		MOVE	TAC2,STRPTR(TAC2)
02500		TDNN	FRIEND,GB1(TAC)
02600		JRST	ARLOP1
02700		TLNN	TAC2,DEDBIT
02800		JRST	ARLOP4		;ALIVE FRIENDLY STONE
02900		JRST	ARLOP3		;DEAD FRIENDLY STONE
03000	ARLOP1:	TLNN	TAC2,DEDBIT
03100		JRST	ARLOP3		;ALIVE ENEMY STONE
03200		JRST	ARLOP4		;DEAD ENEMY STONE
03300	ARLOP2:	TDNN	CLEAR,GB3(TAC)
03400		TDNN	SEARCH,GB3(TAC)
03500		JRST	ARLOP3		;STRONGLY RELATED TO ENEMY
03600	ARLOP4:	ORM	ENEMY,GBOARD(TAC)
03700		POPJ	PDP,		;BOUNDARY POINT
03800	;*****LOOK AT THE FOUR NEIGHBOR POINTS
03900	ARLOP3:	MOVEI	TAC1,3
04000		ORM	BWREG,GBOARD(TAC)	;BAD AREA POINT
04100		MOVEI	TAC,@GODOWN(TAC1)	;GO TO NEIGHBOR POINT
04200		HRLM	TAC1,0(PDP)	;SAVE DIRECTION COUNT
04300		PUSHJ	PDP,ARLOOP
04400		HLRZ	TAC1,0(PDP)
04500		MOVEI	TAC,@GODOWN+2(TAC1)
04600		SOJGE	TAC1,ARLOP3+2
04700		POPJ	PDP,
04800	
04900	;**********
05000	;	COUNT UP THE EXTENT OF THE AREA WE ARE IN NOW.  SINCE
05100	;ARLOOP HAS FOUND ALL BAD POINTS, THERE IS NO NEED TO WORRY ABOUT
05200	;BOUNDING PROBLEMS.
05300	;**********
05400	COUNTA:	TDNN	BWREG,GBOARD(TAC)	;BAD AREA POINT?
05500		TDNN	TAC5,GB1(TAC)		;OFF EDGE?
05600		POPJ	PDP,
05700		TDNN	REPLCE,GB1(TAC)
05800		JRST	COUNT0			;NEW POINT
05900		TDNN	BLANK,GB1(TAC)		;BLANK BOUNDARY?
06000		TDNN	ENEMY,GBOARD(TAC)	;BOUNDARY?
06100		POPJ	PDP,
06200		ANDCAM	ENEMY,GBOARD(TAC)	;OCCUPIED BOARD POINTS
06300		JRST	COUNT3			;ARE NOT BOUNDARIES
06400						;FOR NAMEAR
06500	COUNT0:	ORM	REPLCE,GB1(TAC)		;MARK "BEEN HERE"
06600		TDNE	BLANK,GB1(TAC)
06700		JRST	COUNT1
06800	COUNT3:	TDNE	FRIEND,GB1(TAC)
06900		JRST	COUNT2
07000		AOS	ARAPNT		;DEAD ENEMY STONE COUNTS AS
07100		AOS	ARAPNT		;TWO SECURE AREA POINTS
07200		AOS	ARASEC
07300		AOS	ARASEC
07400		JRST	COUNT2
07500	COUNT1:	TDNE	ENEMY,GBOARD(TAC)
07600		JRST	COUNT2		;DONT COUNT BOUNDARY POINT
07700		AOS	ARAPNT		;ANOTHER AREA POINT
07800		TDNE	SEARCH,GB3(TAC)
07900		AOS	ARASEC		;ANOTHER SECURE AREA POINT
08000	COUNT2:	MOVEI	TAC1,3
08100		HRLM	TAC1,0(PDP)
08200		MOVEI	TAC,@GODOWN(TAC1)
08300		PUSHJ	PDP,COUNTA
08400		HLRZ	TAC1,0(PDP)
08500		MOVEI	TAC,@GODOWN+2(TAC1)
08600		SOJGE	TAC1,COUNT2+1
08700		POPJ	PDP,
08800	
08900	;**********
09000	;	NAME THE AREA JUST FOUND BY INSERTING POINTERS INTO GB1.
09100	;WE NAME EVERY POINT ON THE BOARD WHICH IS NOT BAD AREA AND IS
09200	;CONNECTED TO THE STARTING LOCATION AND IS NOT A BOOUNDARY POINT.
09300	;WE EXPECT:
09400	;	1.  BLANK TO BE 770000000000
09500	;	2.  REPLCE TO BE NAME OF AREA (LSH =30)
09600	;	3.  BWREG TO BE BAD AREA POINT BIT
09700	;	4.  TAC TO BE CURRENT OFFSET ADDRESS
09800	;	5.  TAC5 TO BE BLKOCC+WHTOCC+BNKOCC
09900	;**********
10000	NAMEAR:	TDNN	BWREG,GBOARD(TAC)	;BAD AREA POINT?
10100		TDNE	BLANK,GB1(TAC)		;BEEN HERE ALREADY?
10200		POPJ	PDP,
10300		TDNE	TAC5,GB1(TAC)		;OFF-EDGE POINT?
10400		TDNE	ENEMY,GBOARD(TAC)	;BOUNDARY POINT?
10500		POPJ	PDP,
10600		ANDCAM	BLANK,GB1(TAC)
10700		ORM	REPLCE,GB1(TAC)
10800	;*****SAVE NAMES OF ALL GROUPS IN THIS AREA
10900		TDNN	FRIEND,GB1(TAC)
11000		JRST	NAMEA0-1
11100		LDB	TAC1,[POINT 7,GB1(TAC),28]	;GROUP NAME
11200		MOVEI	TAC2,WHTARM
11300		SKIPN	TAC3,0(TAC2)
11400		JRST	.+4
11500		CAMN	TAC3,TAC1
11600		JRST	NAMEA0-1
11700		AOJA	TAC2,.-4
11800		MOVEM	TAC1,0(TAC2)		;FOUND ANOTHER GROUP
11900		SETZM	1(TAC2)
12000	;*****LOOK AT THE FOUR NEIGHBOR POINTS
12100		MOVEI	TAC1,3
12200	NAMEA0:	HRLM	TAC1,0(PDP)
12300		MOVEI	TAC,@GODOWN(TAC1)
12400		PUSHJ	PDP,NAMEAR
12500		HLRZ	TAC1,0(PDP)
12600		MOVEI	TAC,@GODOWN+2(TAC1)
12700		SOJGE	TAC1,NAMEA0
12800		POPJ	PDP,
12900	
13000	;**********
13100	;	THIS IS THE SETUP ROUTINE FOR THE AREA-DEFINITION
13200	;RECURSION.  NOTE REGISTER TAC MUST BE PRE-SET TO A STARTING
13300	;POINT.  THIS SETUP CAN ONLY BE STARTED INSIDE (POSSIBLE)
13400	;FRIENDLY AREAS.
13500	;**********
13600	ARAPNT:	0			;NUMBER OF AREA POINTS
13700	ARASEC:	0			;NUMBER OF SECURE AREA POINTS
13800	AREA1:	SETZM	ARAPNT
13900		SETZM	ARASEC
14000		PUSHJ	PDP,COUNTA
14100		SKIPG	TAC1,ARAPNT
14200		POPJ	PDP,			;NO AREA POINTS
14300		LSH	TAC1,2
14400		MOVE	TAC2,ARASEC
14500		IMULI	TAC2,7
14600		CAMGE	TAC2,TAC1		;4*ARAPNT≤7*ARASEC?
14700		POPJ	PDP,			;AREA IS TOO INSECURE
14800		SETZ	TAC2,			;WILL HOLD AREA DATA
14900		TRNN	FRIEND,BLKOCC
15000		SKIPA	TAC4,WHDATA
15100		SKIPA	TAC4,BLDATA
15200		TRO	TAC2,400000		;MARK WHITE AREA
15300		OR	TAC2,TACSAV
15400		LSH	TAC2,=9
15500		MOVE	TAC1,ARAPNT
15600		OR	TAC2,TAC1
15700		LSH	TAC2,=9
15800		ADDM	TAC1,=30(TAC4)		;GLOBAL AREA COUNT
15900		MOVE	TAC1,ARASEC
16000		ADDM	TAC1,=31(TAC4)		;GLOBAL SECURE AREA COUNT
16100		OR	TAC2,TAC1
16200		SKIPN	REPLCE,AREAPT
16300		SAILERR <8>	;****NO MORE SLOTS FOR AREA -- ERROR MESSAGE 8 ****
16400		EXCH	TAC2,AREAPT(REPLCE)
16500		MOVEM	TAC2,AREAPT
16600		SKIPE	KWAREA-1
16700		JRST	AREA99		;DONT CHANGE GB1 DATA
16800	;*****PUT THE NAME OF THIS AREA INTO ITS BOARD POINTS
16900		HRLZI	BLANK,770000
17000		LSH	REPLCE,=30
17100		MOVE	TAC,TACSAV
17200		SETZM	WHTARM		;WILL HOLD GROUP NAMES
17300		PUSHJ	PDP,NAMEAR
17400		MOVE	TAC3,ARAPNT
17500		LSH	TAC3,=9
17600		TLO	TAC3,1000	;TAC3 IS # AREAS, # AREA POINTS
17700					;FOR ADDITION TO GROUP DESCRIPTOR
17800		MOVEI	TAC1,WHTARM
17900		SKIPN	TAC2,0(TAC1)
18000		JRST	.+3
18100		ADDM	TAC3,GRPPTR+2*MXARNO(TAC2)
18200		AOJA	TAC1,.-3
18300		MOVEI	BLANK,BNKOCC
18400	AREA99:	MOVEI	REPLCE,NONOCC
18500		POPJ	PDP,
18600	
18700	;**********
18800	;	AREA CAN ONLY BE CALCULATED AFTER THE STRONGLY RELATED
18900	;POINTS HAVE BEEN DETERMINED DURING DEVELOPMENT ANALYSIS.  IT IS
19000	;ALSO NECESSARY FOR THE TACTICAL STATES OF ALL STRINGS TO BE KNOWN.
19100	;AREA IS COMPUTED FOR BOTH PLAYERS BY AN ALGORITHM REPRESENTING
19200	;A GENERALIZATION OF AREA-COUNTING AT THE END OF THE GAME.
19300	;**********
19400	
19500	;*****ARRAY STORAGE FOR THE AREA INDICATORS
19600	↑↑XAREAP:AREAPT		;POINTER FOR SAIL
19700		0
19800		MXARNO-1
19900		1
20000		XWD	1,MXARNO
20100	↑↑AREAPT:BLOCK	MXARNO
20200	
20300		0			;SWITCH FOR STORING RESULTS IN GB1
20400	↑↑KWAREA:SETOM	KWAREA-1	;DONT CHANGE GB1 (DONT SAVE AREA NAMES)
20500		JRST	AREA+1
20600	↑↑AREA:	SETZM	KWAREA-1	;CHANGE GB1 ALSO
20700		MOVEM	PDP,PDPSAV
20800		MOVE	PDP,PNTDPY
20900		ADD	PDP,[IOWD =400,=98]
21000		MOVE	TAC,WHDATA
21100		SETZM	=30(TAC)		;# WHITE AREA POINTS
21200		SETZM	=31(TAC)		;# WHITE SECURE AREA POINTS
21300		MOVE	TAC,BLDATA
21400		SETZM	=30(TAC)		;# BLACK AREA POINTS
21500		SETZM	=31(TAC)		;# BLACK SECURE AREA POINTS
21600		MOVEI	ENEMY,MXARNO-1
21700		SETZM	AREAPT+MXARNO-1
21800		MOVEM	ENEMY,AREAPT-1(ENEMY)
21900		SOJG	ENEMY,.-1
22000		SKIPE	KWAREA-1
22100		JRST	AREA02			;DO NOT TOUCH GB1
22200		MOVEI	TAC,BRDWTH*BRDWTH
22300		HRLZI	TAC1,770000
22400		ANDCAM	TAC1,GB1(TAC)
22500		SOJGE	TAC,.-1
22600	AREA02:	MOVEI	ENEMY,BKOUT	;BOUNDARY MARK IN GBOARD
22700		MOVEI	BWREG,TACBIT	;MARKS BAD AREA POINTS
22800		MOVEI	TAC5,WHTOCC+BLKOCC+BNKOCC
22900		MOVEI	FRIEND,BLKOCC	;SET UP FOR BLACK AREA ANALYSIS
23000		MOVEI	SEARCH,20
23100		SKIPE	TTYGUY
23200		HRLZ	SEARCH,SEARCH	;PDP-10 IS NOT PLAYING BLACK NOW
23300		MOVS	CLEAR,SEARCH	;STRONGLY RELATED TO ENEMY (WHITE)
23400	AREA04:	MOVEI	TAC,BRDWTH*(BRDWTH-1)
23500		MOVEM	TAC,TACSAV
23600		MOVEI	REPLCE,NONOCC
23700		MOVEI	BLANK,BNKOCC
23800		MOVE	TAC4,FRIEND
23900		XORI	TAC4,BLKOCC+WHTOCC
24000	;*****FIRST FIND NOT-AREA POINTS
24100	AREA05:	TDNN	TAC4,GB1(TAC)
24200		JRST	AREA06
24300		LDB	TAC2,[POINT 7,GB1(TAC),35]
24400		MOVE	TAC2,STRPTR(TAC2)
24500		TLNN	TAC2,DEDBIT
24600		PUSHJ	PDP,ARLOOP	;START ONLY ON LIVE ENEMY STONES
24700	AREA06:	SOS	TAC,TACSAV
24800		CAILE	TAC,BRDWTH
24900		JRST	AREA05
25000		MOVEI	TAC,BRDWTH*(BRDWTH-1)
25100		MOVEM	TAC,TACSAV
25200	;*****THEN COUNT AREAS
25300	AREA07:	TDNN	FRIEND,GB1(TAC)
25400		JRST	AREA08
25500		LDB	TAC2,[POINT 7,GB1(TAC),35]
25600		MOVE	TAC2,STRPTR(TAC2)
25700		TLNN	TAC2,DEDBIT
25800		PUSHJ	PDP,AREA1	;START ONLY ON LIVE FRIENDLY STONES
25900	AREA08:	SOS	TAC,TACSAV
26000		CAILE	TAC,BRDWTH
26100		JRST	AREA07
26200	;*****ERASE AREA CALCULATION FLAGS FROM INTERNAL BOARDS
26300		MOVEI	REPLCE,NONOCC
26400		MOVEI	BLANK,TACBIT+BKOUT
26500	AREA01:	MOVE	TAC2,TAC
26600		MOVEI	TAC1,BRDWTH-2
26700		ADDI	TAC2,1
26800		ANDCAM	REPLCE,GB1(TAC2)	;GET RID OF "BEEN THERE" BITS
26900		ANDCAM	BLANK,GBOARD(TAC2)	;GET RID OF BOUNDARY MARKS
27000		SOJG	TAC1,.-3
27100		ADDI	TAC,BRDWTH
27200		CAIE	TAC,BRDWTH*(BRDWTH-1)
27300		JRST	AREA01
27400	;*****SEE IF WE HAVE DONE BOTH SIDES
27500		TRNN	FRIEND,BLKOCC
27600		JRST	AREA03
27700		MOVEI	FRIEND,WHTOCC
27800		EXCH	CLEAR,SEARCH
27900		JRST	AREA04			;ANALYZE WHITE AREAS
28000	AREA03:	MOVE	PDP,PDPSAV
28100		POPJ	PDP,
28200	
28300	BEND
28400	
28500		END